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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于單片機PWM多級調速控制LED和小型直流電機的問題

[復制鏈接]
跳轉到指定樓層
樓主
環境介紹:硬件部分有LD3320語音識別模塊+STC11L56XE+51單片機開發板(普中51-單核-A2)。語音識別模塊的程序已經寫好了(見下部分),每次輸入語音信號后,LD3320模塊對應輸出口輸出一個高電平信號,幾十毫秒后,再輸出低電平信號(如:我說“開燈”,LD3320將IO口P1.0輸出高電平,幾十毫秒后再輸出低電平,LD3320的P1.0接入51的P2.0);LD3320的P1.0~P1.5和51的P2.0~P2.5已經通過杜邦線連接,51的P2.6口為LED高電平輸入口,51的P1.0為風扇的驅動口(相關驅動程序已經寫好)。
整個項目的目的是:通過語音識別的方式,控制LED燈開燈(低亮度),高亮度,關燈;控制直流電機開風扇(低速),高速度,關風扇。
問題1:現在的情況是,我輸入“亮一點”指令后,LED確實是亮度高的那檔,然后輸入“開燈”指令后,LED確實是低亮度那檔,但是如果我先輸入“開燈”指令,LED能低亮度運行,后輸入“亮一點”指令后,LED無法到高亮度那檔(電機的情況通LED)。
問題2:為什么我輸入“關燈”或“關風扇”指令后,LED總會有一點點亮度,電機還會有很微小的轉動。

各位老師幫幫孩子吧,一直沒想到問題在哪里,如有描述不清的地方,我都會盡快回復的,謝謝各位。

語音識別模塊部分程序:
  1. void         User_handle(uint8 dat)
  2. {
  3.      //UARTSendByte(dat);//串口識別碼(十六進制)
  4.                  if(0==dat)
  5.                  {
  6.                   G0_flag=ENABLE;
  7.                         LED=0;
  8.                         PrintCom("小智收到\r\n"); /*text.....*/
  9.                  }
  10.                  else if(ENABLE==G0_flag)
  11.                  {        
  12.                                  G0_flag=DISABLE;
  13.                                 LED=1;
  14.                          switch(dat)                   /*對結果執行相關操作,客戶可刪除Printcom 串口輸出語句替換為其他需要控制的代碼*/
  15.                           {
  16.                                   case CODE_DMCS:                        
  17.                                                 PrintCom("“開燈”命令識別成功\r\n"); /*text.....*/
  18.                                                 PrintCom("主人,已打開燈\r\n"); /*text.....*/
  19.                                                 P10=1;delay(200);P10=0;
  20.                                                 break;
  21.                                         case CODE_KFBYZ:        
  22.                                                 PrintCom("“亮一點”命令識別成功\r\n"); /*text.....*/
  23.                                                 PrintCom("主人,燈亮度已經變高\r\n"); /*text.....*/
  24.                                                 P11=1;delay(200);P11=0;
  25.                                                 break;
  26.                                         case CODE_KD:                                       
  27.                                                 PrintCom("“關燈”命令識別成功\r\n"); /*text.....*/
  28.                                                 PrintCom("主人,已關閉LED\r\n"); /*text.....*/
  29.                                                 P12=1;delay(200);P12=0;
  30.                                                 break;
  31.                                         case CODE_GD:                                                                                       
  32.                                                 PrintCom("“開風扇”命令識別成功\r\n"); /*text.....*/
  33.                                                 PrintCom("主人,已打開風扇\r\n"); /*text.....*/
  34.                                                 P13=1;delay(200);P13=0;
  35.                                                 break;
  36.                                         case CODE_BJ:                                                
  37.                                                 PrintCom("“快一點”命令識別成功\r\n"); /*text.....*/
  38.                                                 PrintCom("主人,風扇轉速已經變高\r\n"); /*text.....*/
  39.                                                 P14=1;delay(200);P14=0;
  40.                                                 break;
  41.                                         case CODE_SH:                                                
  42.                                                 PrintCom("“關風扇”命令識別成功\r\n"); /*text.....*/
  43.                                                  PrintCom("主人,已關閉風扇\r\n"); /*text.....*/
  44.                                                 P15=1;delay(200);P15=0;
  45.                                                 break;
  46.                                         case CODE_GZ:                                       
  47.                                                 PrintCom("“晚安”命令識別成功\r\n"); /*text.....*/
  48.                                                 PrintCom("晚安,主人\r\n"); /*text.....*/
  49.                                                 break;                                                                                                                                                                                                                        
  50.                                                         default:PrintCom("請重新識別發口令\r\n"); /*text.....*/
  51.                                                         break;
  52.                                 }        
  53.                         }        
  54.                         else         
  55.                         {
  56.                                 PrintCom("請說出一級口令\r\n"); /*text.....*/        
  57.                         }
  58. }
復制代碼

51單片機代碼如下:
  1. #include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
  2. #include<intrins.h>                //因為要用到左右移函數,所以加入這個頭文件

  3. typedef unsigned int u16;          //對數據類型進行聲明定義
  4. typedef unsigned char u8;

  5. sbit led1 = P2^0;  //LED標志位1,開啟LED和低亮度
  6. sbit led2 = P2^1;  //LED標志位2,高亮度
  7. sbit led3 = P2^2;  //LED標志位3,關閉LED

  8. sbit fengshan1 = P2^3;         //風扇標志位1,開啟風扇和低速度
  9. sbit fengshan2 = P2^4;         //風扇標志位2,高速度
  10. sbit fengshan3 = P2^5;         //風扇標志位3,關閉風扇

  11. sbit led =  P2^6;//LED驅動位
  12. sbit fengshan = P1^0; //風扇驅動位

  13. u16 Counter,Compare1,Compare2;        //計數值和比較值,用于輸出PWM
  14. u16 led1flag,led2flag,led3flag;
  15. u16 fengshan1flag,fengshan2flag,fengshan3flag;

  16. void delay10ms(void)
  17. {
  18.         unsigned char i,j,k;
  19.         for(i=5;i>0;i--)
  20.          for(j=4;j>0;j--)
  21.           for(k=248;k>0;k--);
  22. }

  23. void LED()
  24. {
  25.         if(led1 == 1)        {led1flag = 1;}
  26.         if(led2 == 1)        {led2flag = 1;}
  27.         if(led3 == 1)        {led3flag = 1;}
  28.                                                                
  29.         if(led1flag == 1)        {Compare1 = 5;led2flag = 0;led3flag = 0;}
  30.         if(led2flag == 1)        {Compare1 = 100;led1flag = 0;led3flag = 0;}
  31.         if(led3flag == 1)        {Compare1 = 0;led1flag = 0;led2flag = 0;}
  32.         
  33. }

  34. void FS()
  35. {
  36.         if(fengshan1 == 1)        {fengshan1flag = 1;}
  37.         if(fengshan2 == 1)        {fengshan2flag = 1;}
  38.         if(fengshan3 == 1)        {fengshan3flag = 1;}

  39.         if(fengshan1flag == 1)         {Compare2 = 40;fengshan2flag = 0;fengshan3flag = 0;}
  40.         if(fengshan2flag == 1)         {Compare2 = 100;fengshan1flag = 0;fengshan3flag = 0;}
  41.         if(fengshan3flag == 1)         {Compare2 = 0;fengshan1flag = 0;fengshan2flag = 0;}        
  42. }

  43. void Timer0_Init(void)
  44. {
  45.         TMOD &= 0xF0;                //設置定時器模式
  46.         TMOD |= 0x01;                //設置定時器模式
  47.         
  48.         TH0 = 0xFF;                    //設置定時初始值   高八位低八位0xFFA4 組成 100us
  49.         TL0 = 0x9C;                    //設置定時初始值
  50.         
  51.         TF0 = 0;                    //清除TF0標志
  52.         TR0 = 1;                    //定時器0開始計時
  53.         ET0=1;                            //允許定時器T0中斷
  54.         EA=1;                             //開啟總中斷
  55.         PT0=0;                             //優先級為低
  56. }

  57. void main()
  58. {
  59.         Timer0_Init();                        //定時器初始化
  60.         P2 = 0;//P2.0-P2.7初始化
  61.         fengshan = 0;

  62.         while(1)
  63.         {        
  64.                 LED();
  65.                 FS();
  66.         }

  67. }

  68. void Timer0() interrupt 1         //進入定時器中斷
  69. {
  70.         TH0 = 0xFF;
  71.         TL0 = 0x9C;                    //重新賦初始值
  72.         
  73.         Counter++;                         //計數值自加
  74.         Counter%=100;                 //計數值變化范圍限制在0~99

  75.         if(led1flag == 1 || led2flag == 1 || led3flag ==1)
  76.         {
  77.                 if(Counter < Compare1)         //計數值小于比較值
  78.                  {
  79.                          led = 1;        
  80.                  }                                                         
  81.                 else          //計數值大于比較值
  82.                 {
  83.                         led = 0;                                       
  84.                 }               
  85.         }

  86.         if(fengshan1flag == 1||fengshan2flag == 1||fengshan3flag == 1)
  87.         {                          
  88.                 if(Counter < Compare2)         //計數值小于比較值
  89.                  {
  90.                          fengshan = 1;        
  91.                  }                                                         
  92.                 else          //計數值大于比較值
  93.                 {
  94.                         fengshan = 0;                                       
  95.                 }               
  96.         }                                
  97. }
復制代碼


語音識別1.png (159.5 KB, 下載次數: 31)

語音識別1.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:123289 發表于 2022-4-28 12:11 | 只看該作者
與你的硬件結構有關。
上圖。
回復

使用道具 舉報

板凳
ID:161164 發表于 2022-4-28 13:15 來自手機 | 只看該作者
改為if(led1){Compare1=5……
回復

使用道具 舉報

地板
ID:735831 發表于 2022-4-28 13:55 | 只看該作者
為什么要在定時器里做比較再做翻轉,既然要穩定的PWM那每做一次判斷和io翻轉的時間不會更長嗎?這邊建議進入中斷后先不要賦值,萬一還沒比較完又開始了第二次中斷就不好了,可以的話計算,比較等問題放在主函數或者子函數調用會比直接在中斷程序中處理更迅速。如果出現微亮那可能是沒有關閉中斷導致IO存在翻轉的情況。可以的話能貼一下原理圖和相關引腳輸出波形(上示波器看)是最好的了,希望能幫助到樓主
回復

使用道具 舉報

5#
ID:735831 發表于 2022-4-28 14:04 | 只看該作者
這里提一下我的看法,定時器中斷在不使用的時候關閉就好,占用資源浪費cpu時間。然后微亮可能是樓主硬件問題最好貼一下原理圖,這里個人的看法是可能定時器沒有關閉導致的進入中斷后重復賦值導致的翻轉。為什么要在中斷里做判斷,如果是要做兩個不同設備的PWM為什么不用兩路定時器,就算只用一路為什么不做標志位回到主函數或者子函數再判斷,如果需要進行的運算復雜的話可以做成子函數再調用會比在中斷中做三四次判斷快得多。最好仔細研究一下你子函數判斷次數,優化代碼冗余,不要做多余判斷
回復

使用道具 舉報

6#
ID:882276 發表于 2022-4-28 14:09 | 只看該作者
yzwzfyz 發表于 2022-4-28 12:11
與你的硬件結構有關。
上圖。

啊,能不能指出比較具體一點的方向,我好去改一下,謝謝您。
回復

使用道具 舉報

7#
ID:882276 發表于 2022-4-28 14:15 | 只看該作者
lkc8210 發表于 2022-4-28 13:15
改為if(led1){Compare1=5……

您好,可以麻煩您說詳細點嗎,謝謝
回復

使用道具 舉報

8#
ID:735831 發表于 2022-4-28 18:46 | 只看該作者
Mr.zxw 發表于 2022-4-28 14:15
您好,可以麻煩您說詳細點嗎,謝謝

判斷的值為這樣 if(ture)執行接下來的代碼ture可以為變量,只要值為ture(1)都會執行
回復

使用道具 舉報

9#
ID:882276 發表于 2022-4-28 21:48 | 只看該作者
hzhehe 發表于 2022-4-28 14:04
這里提一下我的看法,定時器中斷在不使用的時候關閉就好,占用資源浪費cpu時間。然后微亮可能是樓主硬件問 ...

謝謝指點,我研究研究
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本不卡免费新一二三区 | 免费在线观看av | 久久久久久美女 | 五月激情综合 | 蜜桃精品视频在线 | 日韩视频一区二区 | 久久国产精品91 | 免费观看一区二区三区毛片 | 久久69精品久久久久久久电影好 | 午夜久久久久久久久久一区二区 | www.久久久久久久久久久久 | 狠狠夜夜 | 99精品欧美一区二区蜜桃免费 | 激情在线视频 | 久久久av一区 | 日韩精彩视频 | 久久av网 | 久久这里只有精品首页 | 亚洲高清视频在线 | 99热都是精品 | 男女污网站| 久久久91精品国产一区二区三区 | 免费三级黄 | 一本大道久久a久久精二百 欧洲一区二区三区 | 日本中文字幕在线视频 | 男女视频在线免费观看 | 午夜天堂精品久久久久 | av在线一区二区 | 日韩在线观看 | 日本一区二区三区四区 | 二区成人| av免费网址| 久草在线高清 | 国产91久久精品一区二区 | 久久久久久久久久久久久九 | 日本欧美在线观看视频 | 成人夜晚看av| 涩涩视频在线看 | 日韩精品免费在线观看 | www.精品一区 | 久久99精品久久久久久国产越南 |