标题:
关于单片机软件滤波的方法,求大神
[打印本页]
作者:
哈哈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://www.51hei.com/bbs/)
Powered by Discuz! X3.1