找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1988|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)PWM多級(jí)調(diào)速控制LED和小型直流電機(jī)的問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
環(huán)境介紹:硬件部分有LD3320語(yǔ)音識(shí)別模塊+STC11L56XE+51單片機(jī)開(kāi)發(fā)板(普中51-單核-A2)。語(yǔ)音識(shí)別模塊的程序已經(jīng)寫(xiě)好了(見(jiàn)下部分),每次輸入語(yǔ)音信號(hào)后,LD3320模塊對(duì)應(yīng)輸出口輸出一個(gè)高電平信號(hào),幾十毫秒后,再輸出低電平信號(hào)(如:我說(shuō)“開(kāi)燈”,LD3320將IO口P1.0輸出高電平,幾十毫秒后再輸出低電平,LD3320的P1.0接入51的P2.0);LD3320的P1.0~P1.5和51的P2.0~P2.5已經(jīng)通過(guò)杜邦線連接,51的P2.6口為L(zhǎng)ED高電平輸入口,51的P1.0為風(fēng)扇的驅(qū)動(dòng)口(相關(guān)驅(qū)動(dòng)程序已經(jīng)寫(xiě)好)。
整個(gè)項(xiàng)目的目的是:通過(guò)語(yǔ)音識(shí)別的方式,控制LED燈開(kāi)燈(低亮度),高亮度,關(guān)燈;控制直流電機(jī)開(kāi)風(fēng)扇(低速),高速度,關(guān)風(fēng)扇。
問(wèn)題1:現(xiàn)在的情況是,我輸入“亮一點(diǎn)”指令后,LED確實(shí)是亮度高的那檔,然后輸入“開(kāi)燈”指令后,LED確實(shí)是低亮度那檔,但是如果我先輸入“開(kāi)燈”指令,LED能低亮度運(yùn)行,后輸入“亮一點(diǎn)”指令后,LED無(wú)法到高亮度那檔(電機(jī)的情況通LED)。
問(wèn)題2:為什么我輸入“關(guān)燈”或“關(guān)風(fēng)扇”指令后,LED總會(huì)有一點(diǎn)點(diǎn)亮度,電機(jī)還會(huì)有很微小的轉(zhuǎn)動(dòng)。

各位老師幫幫孩子吧,一直沒(méi)想到問(wèn)題在哪里,如有描述不清的地方,我都會(huì)盡快回復(fù)的,謝謝各位。

語(yǔ)音識(shí)別模塊部分程序:
  1. void         User_handle(uint8 dat)
  2. {
  3.      //UARTSendByte(dat);//串口識(shí)別碼(十六進(jìn)制)
  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)                   /*對(duì)結(jié)果執(zhí)行相關(guān)操作,客戶(hù)可刪除Printcom 串口輸出語(yǔ)句替換為其他需要控制的代碼*/
  15.                           {
  16.                                   case CODE_DMCS:                        
  17.                                                 PrintCom("“開(kāi)燈”命令識(shí)別成功\r\n"); /*text.....*/
  18.                                                 PrintCom("主人,已打開(kāi)燈\r\n"); /*text.....*/
  19.                                                 P10=1;delay(200);P10=0;
  20.                                                 break;
  21.                                         case CODE_KFBYZ:        
  22.                                                 PrintCom("“亮一點(diǎn)”命令識(shí)別成功\r\n"); /*text.....*/
  23.                                                 PrintCom("主人,燈亮度已經(jīng)變高\(yùn)r\n"); /*text.....*/
  24.                                                 P11=1;delay(200);P11=0;
  25.                                                 break;
  26.                                         case CODE_KD:                                       
  27.                                                 PrintCom("“關(guān)燈”命令識(shí)別成功\r\n"); /*text.....*/
  28.                                                 PrintCom("主人,已關(guān)閉LED\r\n"); /*text.....*/
  29.                                                 P12=1;delay(200);P12=0;
  30.                                                 break;
  31.                                         case CODE_GD:                                                                                       
  32.                                                 PrintCom("“開(kāi)風(fēng)扇”命令識(shí)別成功\r\n"); /*text.....*/
  33.                                                 PrintCom("主人,已打開(kāi)風(fēng)扇\r\n"); /*text.....*/
  34.                                                 P13=1;delay(200);P13=0;
  35.                                                 break;
  36.                                         case CODE_BJ:                                                
  37.                                                 PrintCom("“快一點(diǎn)”命令識(shí)別成功\r\n"); /*text.....*/
  38.                                                 PrintCom("主人,風(fēng)扇轉(zhuǎn)速已經(jīng)變高\(yùn)r\n"); /*text.....*/
  39.                                                 P14=1;delay(200);P14=0;
  40.                                                 break;
  41.                                         case CODE_SH:                                                
  42.                                                 PrintCom("“關(guān)風(fēng)扇”命令識(shí)別成功\r\n"); /*text.....*/
  43.                                                  PrintCom("主人,已關(guān)閉風(fēng)扇\r\n"); /*text.....*/
  44.                                                 P15=1;delay(200);P15=0;
  45.                                                 break;
  46.                                         case CODE_GZ:                                       
  47.                                                 PrintCom("“晚安”命令識(shí)別成功\r\n"); /*text.....*/
  48.                                                 PrintCom("晚安,主人\r\n"); /*text.....*/
  49.                                                 break;                                                                                                                                                                                                                        
  50.                                                         default:PrintCom("請(qǐng)重新識(shí)別發(fā)口令\r\n"); /*text.....*/
  51.                                                         break;
  52.                                 }        
  53.                         }        
  54.                         else         
  55.                         {
  56.                                 PrintCom("請(qǐng)說(shuō)出一級(jí)口令\r\n"); /*text.....*/        
  57.                         }
  58. }
復(fù)制代碼

51單片機(jī)代碼如下:
  1. #include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器
  2. #include<intrins.h>                //因?yàn)橐玫阶笥乙坪瘮?shù),所以加入這個(gè)頭文件

  3. typedef unsigned int u16;          //對(duì)數(shù)據(jù)類(lèi)型進(jìn)行聲明定義
  4. typedef unsigned char u8;

  5. sbit led1 = P2^0;  //LED標(biāo)志位1,開(kāi)啟LED和低亮度
  6. sbit led2 = P2^1;  //LED標(biāo)志位2,高亮度
  7. sbit led3 = P2^2;  //LED標(biāo)志位3,關(guān)閉LED

  8. sbit fengshan1 = P2^3;         //風(fēng)扇標(biāo)志位1,開(kāi)啟風(fēng)扇和低速度
  9. sbit fengshan2 = P2^4;         //風(fēng)扇標(biāo)志位2,高速度
  10. sbit fengshan3 = P2^5;         //風(fēng)扇標(biāo)志位3,關(guān)閉風(fēng)扇

  11. sbit led =  P2^6;//LED驅(qū)動(dòng)位
  12. sbit fengshan = P1^0; //風(fēng)扇驅(qū)動(dòng)位

  13. u16 Counter,Compare1,Compare2;        //計(jì)數(shù)值和比較值,用于輸出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;                //設(shè)置定時(shí)器模式
  46.         TMOD |= 0x01;                //設(shè)置定時(shí)器模式
  47.         
  48.         TH0 = 0xFF;                    //設(shè)置定時(shí)初始值   高八位低八位0xFFA4 組成 100us
  49.         TL0 = 0x9C;                    //設(shè)置定時(shí)初始值
  50.         
  51.         TF0 = 0;                    //清除TF0標(biāo)志
  52.         TR0 = 1;                    //定時(shí)器0開(kāi)始計(jì)時(shí)
  53.         ET0=1;                            //允許定時(shí)器T0中斷
  54.         EA=1;                             //開(kāi)啟總中斷
  55.         PT0=0;                             //優(yōu)先級(jí)為低
  56. }

  57. void main()
  58. {
  59.         Timer0_Init();                        //定時(shí)器初始化
  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         //進(jìn)入定時(shí)器中斷
  69. {
  70.         TH0 = 0xFF;
  71.         TL0 = 0x9C;                    //重新賦初始值
  72.         
  73.         Counter++;                         //計(jì)數(shù)值自加
  74.         Counter%=100;                 //計(jì)數(shù)值變化范圍限制在0~99

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

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


語(yǔ)音識(shí)別1.png (159.5 KB, 下載次數(shù): 31)

語(yǔ)音識(shí)別1.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:123289 發(fā)表于 2022-4-28 12:11 | 只看該作者
與你的硬件結(jié)構(gòu)有關(guān)。
上圖。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

6#
ID:882276 發(fā)表于 2022-4-28 14:09 | 只看該作者
yzwzfyz 發(fā)表于 2022-4-28 12:11
與你的硬件結(jié)構(gòu)有關(guān)。
上圖。

啊,能不能指出比較具體一點(diǎn)的方向,我好去改一下,謝謝您。
回復(fù)

使用道具 舉報(bào)

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

您好,可以麻煩您說(shuō)詳細(xì)點(diǎn)嗎,謝謝
回復(fù)

使用道具 舉報(bào)

8#
ID:735831 發(fā)表于 2022-4-28 18:46 | 只看該作者
Mr.zxw 發(fā)表于 2022-4-28 14:15
您好,可以麻煩您說(shuō)詳細(xì)點(diǎn)嗎,謝謝

判斷的值為這樣 if(ture)執(zhí)行接下來(lái)的代碼ture可以為變量,只要值為ture(1)都會(huì)執(zhí)行
回復(fù)

使用道具 舉報(bào)

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

謝謝指點(diǎn),我研究研究
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表