欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
關于單片機軟件濾波的方法,求大神
[打印本頁]
作者:
哈哈007
時間:
2018-5-23 16:51
標題:
關于單片機軟件濾波的方法,求大神
這個程序采用的濾波方法不好,我測量5V的電壓是,電壓會跳動,會調到10v,6V,7V,8V有時候還會調到0V,有什么方法嗎
單片機源碼:
#include "12c5a.h"
#include "intrins.h"
#include "stdio.h"
#define uint unsigned int
#define uchar unsigned char
//sfr ADC_LOW2 = 0XBE;
#define ADC_POWER 0X80
#define ADC_FLAG 0X10
#define ADC_START 0X08
#define ADC_SPEEDLL 0X00
#define ADC_SPEEDL 0X20
#define ADC_SPEEDH 0X40
#define ADC_SPEEDHH 0X60
#define N 12
sbit PWM1=P2^0;
sbit P3_1=P3^1;
uchar time;
uint Val=3;
uint Serror,FError,MK=2;
uchar Kp,Ti,Td;
void delay(uint n)
{
uint x;
while(n--)
{
x=5000;
while(x--);
}
}
/*---------------------------- 初始化ADC特殊功能寄存器 -------------------*/
void InitADC( )
{
P1ASF = P1 | 0x3f; //Set P1.0 - P1.5 as analog input port
ADC_RES = 0; //Clear previous result
ADC_RESL = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL ;
delay(20); //ADC power-on delay and Start A/D conversion
}
unsigned int AD_get(unsigned char channel) //ad取值
{
ADC_CONTR=0x88|channel;
_nop_(); _nop_(); _nop_(); _nop_();
while(!(ADC_CONTR&0x10));
ADC_CONTR&=0xe7;
return(ADC_RES*4+ADC_RESL);
}
float AD_work(unsigned char channel) //ad求平均值
{
float AD_val;
unsigned char i;
for(i=0;i<100;i++)
AD_val+=AD_get(channel);
AD_val/=100;
AD_val=AD_get(channel);
AD_val=AD_val*(5.0/1024);
return AD_val;
}
void UART_init()
{
TMOD = 0x20; //T1工作模式2 8位自動重裝
TH1 = 0xfd;
TL1 = 0xfd; //比特率9600
TR1 = 1; //啟動T1定時器
SM0 = 0;
SM1 = 1; //串口工作方式1 10位異步
REN = 1; //串口允許接收
EA = 1; //開總中斷
ES = 1; //串口中斷打開
}
/*********************************************************
發送數據函數
*********************************************************/
void senddata(float dat)
{
ES=0;
TI=1;
printf("%f \n",dat);
while(!TI);
TI = 0;
ES=1;
}
/*************PID初始化函數***************/
void PID_init(void){
Serror=0;
FError=0;
Kp=2;
Ti=500;
Td=10;
}
int PID_control(int Now_speed)
{
int Error,Serror,result;
Error=Now_speed-Val;
Serror=Serror+Error;
MK=(Kp*Error+Kp*0.05/Ti*Serror+Kp*Td/0.05*(Error-FError));
FError=Error;
//對占空比進行限幅處理
if(MK<1)
{MK=1;}
else if(MK>9)
{result=9;}
return MK;
}
void key()
{
}
void main()
{
UART_init();
InitADC( );
// TMOD=0x01;//定時器0工作方式1
// TH0=0xff;//(65536-10)/256;//賦初值定時
// TL0=0xf7;//(65536-10)%256;//0.01ms
// EA=1;//開總中斷
// ET0=1;//開定時器0中斷
// TR0=1;//啟動定時器0
PID_init();
while(1)
{
float k;
k=41*AD_work(0);
PID_control(k);
senddata(Val);
delay(100);
if(P3_1==0)
{
Val++;
}
}
}
//void tim0() interrupt 1
//{
// TR0=0;//賦初值時,關閉定時器
// TH0=0xff;//(65536-10)/256;//賦初值定時
// TL0=0xf9;//(65536-10)%256;//0.01ms
// TR0=1;//打開定時器
// time++;
// if(time>=10) time=0;//1khz
// if(time>=MK) PWM1=0;//點空比%80
// else PWM1=1;
// PWM2=0;
//}
復制代碼
作者:
lxbhcy
時間:
2020-7-28 15:19
試試一階濾波
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1