久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2573|回復: 1
打印 上一主題 下一主題
收起左側

關于單片機軟件濾波的方法,求大神

[復制鏈接]
跳轉到指定樓層
樓主
ID:309126 發表于 2018-5-23 16:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這個程序采用的濾波方法不好,我測量5V的電壓是,電壓會跳動,會調到10v,6V,7V,8V有時候還會調到0V,有什么方法嗎

單片機源碼:
  1. #include "12c5a.h"
  2. #include "intrins.h"
  3. #include "stdio.h"
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. //sfr ADC_LOW2  = 0XBE;
  7. #define ADC_POWER   0X80
  8. #define ADC_FLAG    0X10
  9. #define ADC_START   0X08                        
  10. #define ADC_SPEEDLL 0X00
  11. #define ADC_SPEEDL  0X20
  12. #define ADC_SPEEDH  0X40
  13. #define ADC_SPEEDHH 0X60
  14. #define N 12

  15. sbit PWM1=P2^0;
  16. sbit P3_1=P3^1;
  17. uchar time;
  18. uint Val=3;
  19. uint Serror,FError,MK=2;
  20. uchar Kp,Ti,Td;

  21. void delay(uint n)
  22. {
  23.         uint x;
  24.         while(n--)
  25.         {
  26.                 x=5000;
  27.                 while(x--);
  28.         }
  29. }

  30. /*---------------------------- 初始化ADC特殊功能寄存器 -------------------*/

  31. void InitADC( )
  32. {

  33.           P1ASF = P1 | 0x3f;                //Set  P1.0 - P1.5 as analog input port
  34.           ADC_RES  = 0;                  //Clear previous result
  35.           ADC_RESL = 0;
  36.           ADC_CONTR = ADC_POWER | ADC_SPEEDLL ;
  37.           delay(20);                      //ADC power-on delay and Start A/D conversion
  38. }
  39. unsigned int AD_get(unsigned char channel)                //ad取值
  40. {
  41.         ADC_CONTR=0x88|channel;   
  42.         _nop_(); _nop_(); _nop_(); _nop_();
  43.         while(!(ADC_CONTR&0x10));   
  44.                 ADC_CONTR&=0xe7;   
  45.         return(ADC_RES*4+ADC_RESL);  
  46. }
  47. float AD_work(unsigned char channel)                         //ad求平均值
  48. {
  49.         float AD_val;   
  50.         unsigned char i;
  51.         for(i=0;i<100;i++)
  52.         AD_val+=AD_get(channel);
  53.         AD_val/=100;
  54.         AD_val=AD_get(channel);
  55.         AD_val=AD_val*(5.0/1024);
  56.         return AD_val;
  57. }
  58. void UART_init()
  59. {
  60.         TMOD = 0x20;          //T1工作模式2  8位自動重裝
  61.         TH1 = 0xfd;
  62.         TL1 = 0xfd;         //比特率9600
  63.         TR1 = 1;                //啟動T1定時器
  64.         SM0 = 0;
  65.         SM1 = 1;                 //串口工作方式1 10位異步
  66.         REN = 1;                //串口允許接收
  67.         EA  = 1;                //開總中斷
  68.         ES  = 1;                //串口中斷打開
  69. }

  70. /*********************************************************

  71.   發送數據函數

  72. *********************************************************/
  73. void senddata(float dat)
  74. {
  75.          ES=0;
  76.          TI=1;
  77.      printf("%f \n",dat);
  78.      while(!TI);
  79.      TI = 0;
  80.          ES=1;
  81. }

  82. /*************PID初始化函數***************/
  83. void PID_init(void){
  84.         Serror=0;
  85.         FError=0;
  86.         Kp=2;
  87.         Ti=500;
  88.         Td=10;
  89.         }

  90. int PID_control(int Now_speed)
  91. {
  92.         int Error,Serror,result;
  93.         Error=Now_speed-Val;
  94.         Serror=Serror+Error;
  95.         MK=(Kp*Error+Kp*0.05/Ti*Serror+Kp*Td/0.05*(Error-FError));
  96.         FError=Error;
  97.         //對占空比進行限幅處理
  98.         if(MK<1)
  99.         {MK=1;}
  100.         else if(MK>9)
  101.         {result=9;}
  102.         return MK;
  103. }

  104. void key()
  105. {

  106. }


  107. void main()
  108. {      
  109.         UART_init();
  110.         InitADC( );
  111. //        TMOD=0x01;//定時器0工作方式1
  112. //        TH0=0xff;//(65536-10)/256;//賦初值定時
  113. //        TL0=0xf7;//(65536-10)%256;//0.01ms
  114. //        EA=1;//開總中斷
  115. //        ET0=1;//開定時器0中斷
  116. //        TR0=1;//啟動定時器0
  117.         PID_init();
  118.         while(1)
  119.         {
  120.                 float k;
  121.       
  122.                 k=41*AD_work(0);
  123.                 PID_control(k);
  124.                 senddata(Val);
  125.                 delay(100);
  126.                         if(P3_1==0)
  127.         {
  128.                 Val++;
  129.         }
  130.                
  131.         }
  132. }


  133. //void tim0() interrupt 1
  134. //{
  135. //        TR0=0;//賦初值時,關閉定時器
  136. //        TH0=0xff;//(65536-10)/256;//賦初值定時
  137. //        TL0=0xf9;//(65536-10)%256;//0.01ms
  138. //        TR0=1;//打開定時器
  139. //        time++;
  140. //        if(time>=10) time=0;//1khz
  141. //        if(time>=MK) PWM1=0;//點空比%80
  142. //        else PWM1=1;
  143. //        PWM2=0;      
  144. //}
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:808700 發表于 2020-7-28 15:19 | 只看該作者
試試一階濾波
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品在线观看 | 欧美日韩精品在线免费观看 | 国产精品久久a | 91在线中文字幕 | 九九综合 | 一级毛片视频 | 涩涩鲁亚洲精品一区二区 | 一区二区三区日本 | 精品欧美一区二区三区久久久小说 | 99综合| 日韩精品一区二区三区在线 | 国产精品精品视频一区二区三区 | 国产在线一区二区三区 | 久久久精品网站 | 自拍在线| 岛国在线免费观看 | 久久国内 | 婷婷色在线播放 | 欧美日韩在线视频一区 | 在线免费视频一区 | 亚洲精品1区 | 精品一区二区三区四区 | 黄色成人在线网站 | 亚洲福利一区 | 你懂的国产 | 最新中文字幕久久 | 91精品国产综合久久香蕉麻豆 | 亚洲精品99 | 亚洲精品乱码8久久久久久日本 | 欧美一级α片 | 一级视频黄色 | 久久国产精品精品国产色婷婷 | 久久久精品日本 | 99视频免费在线观看 | 日韩在线看片 | 成人av鲁丝片一区二区小说 | 亚洲欧洲一区二区 | 产真a观专区 | 久久免费精品 | www.日本三级 | 亚洲在线一区二区 |