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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

為什么我的單片機程序輸出PWM頻率2-3秒才反應一次呢求大佬

[復制鏈接]
跳轉到指定樓層
樓主
ID:688939 發表于 2020-3-18 00:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <main.h>                                       
  2. int  PWM_I,PWM_P;
  3. unsigned char  count  ,        high_time=0;                //占空比調節
  4. bit  flag;               
  5. uint temp_m1=0;
  6. int temp_m=0;  //溫度放大100倍后的中轉值
  7. int set_temp=0; //設置溫度*100


  8. void InitTimer0(void)                                           //
  9. {
  10.     TMOD = 0x01;
  11.     TH0 = 0x28;
  12.     TL0 = 0x00;
  13.     EA = 1;
  14.     ET0 = 1;
  15.     TR0 = 1;


  16. }


  17. void  pid_control ()                         //PID控制
  18. {
  19.         if(set_temp>temp_m)
  20.         {
  21.         if(set_temp-temp_m>250)           //如果設定溫度大于實際溫度2.5度
  22.                 high_time=100;                           //全力加熱
  23.                 else                                                                   //否則
  24.                 {
  25.            PWM_I=pid_calc(&temp_PID,temp_m);                  //  高電平輸出PID計算值
  26.                         if(high_time<=100)
  27.                         high_time= PWM_I;                                                        //限制高電平最大100
  28.                         else
  29.                                 high_time=100;        
  30.         }
  31. }
  32.         else
  33.          high_time=0;                   //實際大于設定時輸出低電平
  34. }




  35. void Timer0Interrupt(void) interrupt 1                //PWM波輸出
  36. {
  37.         if(++count<=(high_time))           //
  38.         PWM=0;
  39.         else if(count<=100)
  40.         PWM=1;
  41.         else
  42.         count=0;
  43.     TH0 = 0x28;
  44.     TL0 = 0x00;
  45. }










  46. void main()//主函數
  47. {


  48.            InitTimer0();                                                         //定時器初始化
  49.     init();//初始化函數
  50.         pid_init (&temp_PID);                                        //PID初始化
  51.     temp_PID.Proportion =60;              //設置PID比例系數
  52.     temp_PID.Integral   =5;                            //設置PID積分系數
  53.     temp_PID.Derivative =2;                            //設置PID微分系數


  54.         
  55.   while(1)
  56.         {
  57.                 temp_control();//控制按鍵函數
  58.                
  59.                 temp_m1=get_temp(Ds18b20ReadTemp());                         //提取計算溫度值


  60.                 display_real_tenp(temp_m1);                                                                 //顯示函數          刷新溫度        


  61.                  temp_m=unnormal_proccessing(temp_m1);                 //計數值=60  賦值溫度放大100倍溫度轉換函數*100
  62.         
  63.                 pid_control();


  64.                                 PWM_P=high_time;
  65.                         LcdWriteCom(0x80+0X40+0x0C);
  66.                                 LcdWriteData('0'+PWM_P/100);
  67.                                  LcdWriteCom(0x80+0X40+0x0D);
  68.                                 LcdWriteData('0'+PWM_P%100/10);
  69.                                 LcdWriteCom(0x80+0X40+0x0E);
  70.                                 LcdWriteData('0'+PWM_P%10);
  71.                  }


  72.         }               




  73. void init()//初始化函數
  74. {
  75.         uint i,j;
  76.         //函數初始化


  77.         LcdInit();//LCD初始化函數
  78.         Ds18b20Init();                   //18b20初始化
  79.         
  80.         //I/O口初始化
  81.         PWM=0;//不制熱


  82.         
  83.         //LCD初始化顯示
  84.         LcdWriteCom(0x80);//第一行顯示
  85.         j=strlen(num1);
  86.         for(i=0; i<j; i++)
  87.         {
  88.                 LcdWriteData(num1[i]);        [/i][i]
  89.                 delay_ms(1);
  90.         }
  91.         LcdWriteCom(0x80+0x40);//第二行顯示
  92.         j=strlen(num2);
  93.         for(i=0; i<j; i++)
  94.         {
  95.                 LcdWriteData(num2[i]);        [/i][i]
  96.                 delay_ms(1);
  97.         }
  98.         LcdWriteCom(0x04);  //關閉寫一個指針加1


  99. }


  100. uint get_temp(uint temp)//計算溫度函數
  101. {
  102.         float tp;
  103.         
  104.         tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  105.         //如果溫度是正的那么,那么正數的原碼就是補碼它本身
  106.         temp=tp*0.0625*100+0.5;        
  107.         //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  108.         //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  109.         //算加上0.5,還是在小數點后面。
  110.         return temp;
  111. }


  112. void display_real_tenp(uint temp)//實時溫度顯示函數
  113. {
  114.         uchar datas[] = {0, 0, 0, 0}; //定義數組


  115.         datas[0] = temp % 10000 / 1000;
  116.         datas[1] = temp % 1000 / 100;
  117.         datas[2] = temp % 100 / 10;
  118.         datas[3] = temp % 10;

  119.         LcdWriteCom(0x80+0x0a);                 //寫地址 80表示初始地址
  120.         LcdWriteData('0'+datas[0]); //十位


  121.         LcdWriteCom(0x80+0x0b);        //寫地址 80表示初始地址
  122.         LcdWriteData('0'+datas[1]); //個位


  123.         
  124.         LcdWriteCom(0x80+0x0d);         //寫地址 80表示初始地址
  125.         LcdWriteData('0'+datas[2]); //顯示小數點  


  126.         
  127.         LcdWriteCom(0x80+0x0e);                 //寫地址 80表示初始地址
  128.         LcdWriteData('0'+datas[3]); //顯示小數點  


  129.         
  130. }


  131. void temp_control()//控制溫度上下限函數
  132. {
  133.         if(limit_choise==0)//選擇按鍵
  134.         {
  135.                 delay_ms(5);
  136.                 if(limit_choise==0)
  137.                 {
  138.                         while(!limit_choise);
  139.                         limit_choise_num++;
  140.                         if(limit_choise_num>=2)
  141.                         {
  142.                                 limit_choise_num=0;
  143.                         }
  144.                 }
  145.         }
  146.         if(limit_choise_num==0)//正常顯示
  147.         {
  148.                 LcdWriteCom(0x0c);//關閉光標
  149.         
  150.         }
  151.                         
  152.         if(limit_choise_num==1)//調節上限溫度
  153.         {
  154.                 LcdWriteCom(0x80+0X40+2);
  155.                 LcdWriteCom(0x0f);//開啟光標
  156.                 if(increase_temperature==0)//增加溫度
  157.                 {
  158.                         delay_ms(5);
  159.                         if(increase_temperature==0)
  160.                         {
  161.                                 while(!increase_temperature);
  162.                                 up_limit_temp++;
  163.                                 if(up_limit_temp>=100)
  164.                                 {
  165.                                         up_limit_temp=0;
  166.                                 }
  167.                                 //寫入新數據
  168.                                 LcdWriteCom(0x80+0X40+0x03);
  169.                                 LcdWriteData('0'+up_limit_temp/10);
  170.                                 LcdWriteCom(0x80+0X40+0x04);
  171.                                 LcdWriteData('0'+up_limit_temp%10);
  172.                                 LcdWriteCom(0x80+0X40+2);//光標回寫
  173.                         }
  174.                 }
  175.                 if(reduce_temperature==0)//減少溫度
  176.                 {
  177.                         delay_ms(5);
  178.                         if(reduce_temperature==0)
  179.                         {
  180.                                 while(!reduce_temperature);
  181.                                 up_limit_temp--;
  182.                                 if(up_limit_temp<0)
  183.                                 {
  184.                                         up_limit_temp=99;
  185.                                 }
  186.                                 //寫入新數據
  187.                                 LcdWriteCom(0x80+0X40+0x03);
  188.                                 LcdWriteData('0'+up_limit_temp/10);
  189.                                 LcdWriteCom(0x80+0X40+0x04);
  190.                                 LcdWriteData('0'+up_limit_temp%10);
  191.                                 LcdWriteCom(0x80+0X40+2);//光標回寫
  192.                         }
  193.                 }


  194.         }
  195.          set_temp=up_limit_temp*100;                   //放大100倍計算
  196.         temp_PID.SetPoint   =set_temp;
  197.         
  198. }


  199. int unnormal_proccessing(uint temp)//溫度轉換函數
  200. {
  201.         uchar datas[] = {0, 0, 0, 0}; //定義數組
  202.         int temp1=0;


  203.         datas[0] = temp % 10000 / 1000;
  204.         datas[1] = temp % 1000 / 100;
  205.         datas[2] = temp % 100 / 10;
  206.         datas[3] = temp % 10;
  207.         temp1=datas[0]*1000+datas[1]*100+datas[2]*10+datas[3];//實際的溫度乘以100
  208.          return temp1;


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

使用道具 舉報

沙發
ID:688939 發表于 2020-3-18 09:39 | 只看該作者
有沒有大佬幫忙看一下
回復

使用道具 舉報

板凳
ID:158375 發表于 2020-3-18 12:43 | 只看該作者
估計是定時中斷的處理問題:
// Timer0 中斷
void Timer0Interrupt(void) interrupt 1    //PWM波輸出
  {
  if(++count <= (high_time))     //
    PWM=0;
  else
    if(count <= 100)
      PWM=1;
    else
      count=0;
      TH0 = 0x28;
      TL0 = 0x00;
  }
------
邏輯弄清,才能控制。
回復

使用道具 舉報

地板
ID:213173 發表于 2020-3-18 21:51 | 只看該作者
郗樂斌 發表于 2020-3-18 09:39
有沒有大佬幫忙看一下

用了一個ds18b20溫度LCD顯示程序給你改成0~120都可調恒溫控制程序,仿真正常,實際電路可能還要進一步完善。
0~120度PWM恒溫控制LCD顯示 仿真.zip (162.29 KB, 下載次數: 7)

回復

使用道具 舉報

5#
ID:688939 發表于 2020-3-21 22:09 | 只看該作者
wulin 發表于 2020-3-18 21:51
用了一個ds18b20溫度LCD顯示程序給你改成0~120都可調恒溫控制程序,仿真正常,實際電路可能還要進一步完 ...

謝謝你的仿真非常穩定, 但是程序好像有些問題,關鍵這個不是PID控制吧
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中国大陆高清aⅴ毛片 | 99久久国产 | 成人在线视频免费观看 | 91久久| 成年人精品视频 | 91精品国产一区二区三区香蕉 | 国产中文一区二区三区 | 日本一区二区三区在线观看 | 伊人超碰在线 | 国产在线一区二区三区 | 日本不卡一区二区三区在线观看 | 成年人网站国产 | 亚洲一视频| 久久国产精品久久久久久 | 国产一级片91 | 伊人在线| 黄色一级电影在线观看 | 日韩欧美中文字幕在线观看 | 中文字幕在线网 | 日本免费一区二区三区四区 | 欧美一区二区三区四区视频 | 成人免费一区二区三区牛牛 | 九九精品在线 | 日本电影网站 | 国产欧美日韩精品在线观看 | 午夜精品视频 | 免费a v网站| 青青草视频网 | 夜夜干夜夜操 | 懂色av色香蕉一区二区蜜桃 | 亚洲免费在线 | 欧美日韩在线免费观看 | 亚洲免费视频一区二区 | 免费视频一区二区 | 精品欧美乱码久久久久久1区2区 | 亚洲一二三区免费 | 亚洲视频精品在线 | 免费在线观看一区二区 | 黄色成人在线观看 | 中文字幕 欧美 日韩 | www.亚洲精品 |