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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機直流電機PWM調速系統的設計與Proteus仿真工程

[復制鏈接]
跳轉到指定樓層
樓主



直流電機
PWM調速系統的設計與仿真
  •          引言

1本課題設計的目的和要求

              1.              直流電機PWM調速系統的目的:

   (1) 熟悉直流電機PWM調速系統的整體運行過程和總體布局

                 (2) 掌握該硬件電路的設計方法

       (3) 掌握電機PWM調速系統程序的設計和調試

       2. 直流電機PWM調速系統的要求

      (1)可輸入0~1范圍的占空比,占空比可用電位器輸入、撥碼開關輸入或鍵盤輸入。

(2)設計電機驅動電路,根據輸入的占空比控制電機轉速。

(3)檢測電機轉速,并用LED或LCD顯示。

(4)在PROTUES下仿真。



二、系統總體框圖與原理說明

              2.1 總體方案原理及設計框圖

                            本設計是基于AT89c51為核心的直流調速器,由單片機控制和產生適合要求的PWM信號,該PWM信號通過驅動芯片電路進行直流調速,使輸出電壓平均值和功率可以按照PWM信號的占空比而變化,從而達到對直流電機調速的目的。撥碼開關輸入0~1范圍的占空比,用LCD1602作為主液晶顯示器,顯示輸入的占空比控制電機轉速,能夠實現較好的人機交互。


總體方案設計框圖



三、硬件電路圖



              3.1 PWM產生方式

              (1)PWM(脈沖寬度調制)是通過控制固定電壓的直流電源開關頻率,改變負載兩端的電壓,從而達到控制要求的一種電壓調整方法。PWM可以應用在很多方面,比如:電機調速、溫度控制、壓力控制等等。

              在PWM驅動控制的調整系統中,按一個固定的頻率來接通和斷開的電源,并且根據需要改變一個周期內“接通”和“斷開”時間的長短。通過改變直流電機電樞上電壓的“占空比”來達到改變平均電壓大小的目的,從而來控制電動機的轉速。正因為如此,PWM又被稱為“開關驅動裝置”。PWM波形如圖所示:

PWM波形圖

              設電機始終接通電路時,電機轉速最大為,設占空比為:

則電機的平均轉速為

其中指的是電機的平均速度,是指電機在全通電時最大速度,D指的是占空比。

由上面的公式可見,當改變占空比D時,就可以得到不同電機平均速度,從而達到調速的目的。

              (2)單片機片內軟件生成PWM信號

                            PWM信號采用延時的方式產生,這樣實現比較容易,可以節約硬件成本。

if(Flag0)

{

for(a=0;a<N*PWM_percent;a++)

{

              if(flag) k1=1;


              else k2=1;

}

for(a=0;a<N*(1-PWM_percent);a++)

{

              k1=k2=0;

}

}

else

{

k1=k2=1;

}


3.2撥碼開關模塊的設計

              本設計輸入用4位的撥碼開關,能產生16數值,每一種數值對應于一個占空比的值,當輸入為16時,最大的占空比為100%,能調節到最大的電機轉速。






3.3顯示模塊的設計

              本設計用LCD1602作為顯示模塊,它是一種專門用來顯示字母、數字、符號等的點陣型液晶模塊,可以顯示兩行,提供各種控制命令,如:清屏、字符閃爍、光標閃爍、顯示移位等多種功能。




在進行寫入數據時,我們設計了一個函數將要輸入的字符串整個寫入,減少了代碼量,也使程序看起來更加簡潔

void lcd_show_str(unsigned char *str)

{


              while (*str != '\0')

              {

                            LED_data(*str++); //同一優先級,先取內容后自增

              }

}

因為要顯示測得的速度,而速度又是一個不止1位的整數,所以必須分離速度的各個位數值并寫入LCD1602中。程序實現如下。

void display()

{

  LED_start(0x86);

  if(speed/10000==0)

  {

                  s[0]=' ';

   }

   else

   {

                               s[0]=speed/10000+0x30;

   }

  if(speed/1000==0)

   {

                 s[1]=' ';

              }

              else

              {

                              s[1]=              speed%10000/1000+0x30;

              }

              if(speed/100==0)

              {

                            s[2]= ' ';            

              }

              else

              {

                            s[2]=speed%10000%1000/100+0x30;

              }

              if(speed/10==0)

              {

                            s[3]=' ';

              }

              else

              {

                            s[3]=speed%10000%1000%100/10+0x30;

              }

    s[4]=speed%10000%1000%100%10+0x30;




    lcd_show_str(s);


}


3.4直流電機驅動模塊

              本設計采用L298芯片來驅動電機,內部含有四通道邏輯驅動電路,是一種二相和四相的專用驅動器,PWM配合橋式L298可以較為容易的實現電機的調速,其中還用到了二極管對電機進行保護作用。電路圖如下。



3.3模擬直流電機測速模塊

              利用MOTOR-ENCODER每轉一圈1/2引腳輸出一次高電平的性能,我們將1/2引腳接入異或門的兩個輸入端,再將輸出端接到外部中斷1處,外部中斷1每次收到一個高電平則進入中斷,中斷內是將speed加一,另外定時器0中斷控制1s中記一次數,因此可以得到電動機每秒的轉速,另外設置定時器1中斷,使得T1計數十次的時候也就是1s時Speed清零。程序如下,電路圖也如下

  1. ////****************************************************************************----1秒計時//

  2. void int1_isr(void)interrupt 2//中斷1函數
  3. {
  4. speed++;
  5. }
  6. timer0()interrupt 1 using 1 //T0中斷函數
  7. {
  8.               P2_1=~P2_1;
  9.               TH0=(65535-65050)/256;
  10.     TL0=(65335-65050)%256;
  11. }
  12. timer1()interrupt 3 using 2 //T1中斷函數

  13. {
  14.               display();
  15.               speed=0;
  16. }
復制代碼

              

MORTOR-ENCODER電機                    中斷引腳設置

3.4 電動機調速功能實現模塊

電動機調速功能分為以下四種:

  • 加速
  • 減速
  • 反轉
  • 停止

1.加速模塊利用增加PWM波的占空比增加電機速度,每按一次按鍵加速5%。程序設計是利用對按鍵按下的判斷處理占空比變量加一。代碼如下

  •       減速模塊同理利用減小PWM占空比實現

  •       反轉模塊利用L298N的引腳IN0IN1輸入01實現反轉,代碼中設置了反轉標志位flag,如果flag1進行正轉,如果flag0進行反轉。在主函數生成pwm波時對flag進行判斷以輸出0,1實現電機的反轉

  •       停功能

剎停功能的實現同樣利用L298芯片實現,同時也將占空比變為0。同樣設置一個剎停標志位Flag0,當剎停按鍵按下時Flag0置零并將占空比變量置零,而在PWM波形輸出模塊中,Flag0為1是輸出PWM波輸出的條件,因此不輸出PWM波且,IN1和IN2都為高電平因此達到剎停效果。

  •       自定義速度功能

自定義速度功能通過設置占空比實現,這里將PWM波的占空比分為了16檔,用到了撥碼開關,共4位二進制數也就是=16種情況。最高占空比為100%,低電平有效,而這些利用單片機P1引腳的高四位實現,具體代碼如下。

if(P1_2==0)                                          //自定義速度(15個檔)

{

              delay(5);                                          //消抖

              PWM_percent=(((0xf0)&(~P1))*100)/(0xf0);

              PWM_percent=PWM_percent*0.01;                                                                                                                       //將輸入的二進制數轉換成為占空比

}


3.5按鍵設計模塊

在設計過程中,我們利用外部中斷0,將接了五個按鍵的引腳連線同時接入一個與門,與門的輸出則接到外部中斷0,使得每次按下按鍵都會進入中斷0函數,執行相應的功能代碼。

題目要求實現五種功能,



四、仿真說明

              (1)初始界面時,撥碼開關沒有設置PWM,直流電機處于停止狀態,LCD1602顯示PWM為0%,電機速度也為0,示波器顯示波形也為低電平。

   


              (2)按一次加速按鍵,占空比增加5%

         

按一次減速按鍵,速度減小5%(之前占空比為20%)

按剎停按鍵,速度減小至0,占空比為0

調節撥碼開關設置自定義占空比


按反轉鍵,電機反轉并在LCD中由Z變為F

測速模塊

利用encode電機的轉一圈上方兩側引腳輸出高電平接一個異或門從而通過上升沿反映電機轉一圈,并給中斷1送信號speed+1,記出一秒內speed表轉速。



P3.1口輸出PWM波形




六、心得體會

巧妙運用計時器可以達到預想中的計時效果,運用各元件的特性可以最優化電路圖,在設計的過程中如果遇到問題別灰心,靜下來想一想,或者在網上找找他人的做法,也許對你的設計有異曲同工之妙。程序設計需細致,符號一錯全盤出錯。中斷是個好東西,如果巧妙利用外部中斷可以使得你的程序更加具有可辯性和通用性。

  1. #include<reg51.h>
  2. #define N 750
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit k1=P3^0;
  6. sbit k2=P3^1;
  7. sbit P2_0=P2^0;
  8. sbit P2_1=P2^1;
  9. sbit P2_2=P2^2;
  10. sbit P1_0=P1^0;
  11. sbit P1_1=P1^1;
  12. sbit P1_2=P1^2;
  13. sbit P3_2=P3^2;
  14. sbit P1_3=P1^3;
  15. bit flag=1;
  16. unsigned char s[6]="00000";
  17. sbit en=P2^5;                //1602             6管腳
  18. sbit rs=P2^7;                //1602端口         4管腳
  19. sbit rw=P2^6;                //lcd1602控制端口  5管腳
  20. double PWM_percent=0;
  21. int speed=0;
  22. //****************************************************************************----延時小函數//
  23. void lcd_show_str(unsigned char *str);
  24. void LED_start(uchar com);
  25. void LED_data(uchar date);
  26. void delay(uint z);
  27. void display();
  28. void display_percent();
  29. void lcd_show_str(unsigned char *str)
  30. {

  31.         while (*str != '\0')
  32.         {
  33.                 LED_data(*str++); //同一優先級,先取內容后自增
  34.         }
  35. }
  36. void delay(uint z)//延時1ms函數
  37. {

  38.         uint x,y;
  39.         for(x=0;x<z;x++)
  40.              for(y=0;y<110;y++);
  41. }

  42. //******************************************************************************---LED顯示//
  43. void LED_start(uchar com)//向1602寫一字節(控制指令)
  44. {
  45.   rs=0;
  46.   P0=com;
  47.   delay(5);
  48.   en=0;
  49.   delay(10);
  50.   en=1;
  51. }
  52. void LED_data(uchar date)//向1602寫一字節(數據)
  53. {
  54.   rs=1;
  55.   P0=date;
  56.   delay(5);
  57.   en=0;
  58.   delay(5);
  59.   en=1;
  60. }
  61. void display()
  62. {
  63.   LED_start(0x86);
  64.   if(speed/10000==0)
  65.   {
  66.             s[0]=' ';
  67.   }
  68.    else
  69.    {
  70.                    s[0]=speed/10000+0x30;
  71.    }
  72.    if(speed/1000==0)
  73.    {
  74.            s[1]=' ';
  75.         }
  76.         else
  77.         {
  78.                   s[1]=        speed%10000/1000+0x30;
  79.         }
  80.         if(speed/100==0)
  81.         {
  82.                 s[2]= ' ';       
  83.         }
  84.         else
  85.         {
  86.                 s[2]=speed%10000%1000/100+0x30;
  87.         }
  88.         if(speed/10==0)
  89.         {
  90.                  s[3]=' ';
  91.         }
  92.         else
  93.         {
  94.                 s[3]=speed%10000%1000%100/10+0x30;
  95.         }
  96. s[4]=speed%10000%1000%100%10+0x30;
  97.        
  98.          

  99.   lcd_show_str(s);

  100. }

  101. void display_percent()
  102. {
  103.         int m=PWM_percent*100;
  104.         LED_start(0xc8);
  105.   if(m/100==0)
  106.   LED_data(' ');
  107.   else
  108.   LED_data(m/100+0x30);                   //百分百占空比,否則顯示空格

  109.   if(m/10==0)
  110.                 LED_data(' ');
  111.   else
  112.                 LED_data(m%100/10+0x30);              //顯示十位
  113.           LED_data(m%100%10+0x30);              //顯示個位
  114. }
  115. //****************************************************************************----功能區//

  116. void int0_isr(void)interrupt 0 //中斷0函數    和   它的流氓按鍵們
  117. {
  118.        
  119. if(P1_0==0)                                          //加速
  120. {
  121.         delay(5);                                          //消抖
  122. if(PWM_percent<1)
  123.         PWM_percent=PWM_percent+0.05;
  124. if(PWM_percent+0.05>1)//判斷占空比溢出
  125.         PWM_percent=1;
  126. }


  127. if(P1_1==0)                                          //減速
  128. {
  129.         delay(5);                                          //消抖
  130. if(PWM_percent>0)
  131.         PWM_percent=PWM_percent-0.05;
  132. if(PWM_percent+0.05<0)
  133.         PWM_percent=0;
  134. }


  135. if(P1_3==0)                           //停止
  136. {
  137.         delay(5);                                          //消抖
  138.         PWM_percent=0;
  139. }

  140. if(P1_2==0)                                          //自定義速度(15個檔)
  141. {
  142.         delay(5);                                          //消抖
  143.         PWM_percent=(((0xf0)&(~P1))*100)/(0xf0);
  144.         PWM_percent=PWM_percent*0.01;                                                                       //將輸入的二進制數轉換成為占空比
  145. }

  146. if(P2_0==0)
  147. {       
  148.         delay(5);                                          //消抖
  149.         flag=~flag;                                                //反向加速
  150. }
  151. display_percent();                                    //每次調速后顯示
  152. LED_start(0xcf);
  153. if(flag) LED_data('Z');
  154. else LED_data('F');  
  155.        
  156. }
  157. void init()               //初始化函數
  158. {
  159.   en=0;
  160.   rw=0;
  161.   LED_start(0x01);        //lcd初始化
  162.   LED_start(0x38);        //5X7顯示
  163.   LED_start(0x0c);
  164.        
  165.         LED_start(0x80);
  166.         lcd_show_str("speed:");
  167.        
  168.   
  169.         LED_start(0x8b);              //第一行顯示轉速
  170.         lcd_show_str("r/m");

  171.        
  172.   LED_start(0xc0);        //在第二行顯示Percent:
  173.   lcd_show_str("Percent:");
  174.   
  175.   display_percent();
  176.         LED_data('%');
  177.         LED_start(0xcf);
  178.         LED_data('Z');
  179.        
  180. }

  181. ////****************************************************************************----1秒計時//
  182. void int1_isr(void)interrupt 2//中斷1函數
  183. {
  184. speed++;
  185. }
  186. timer0()interrupt 1 using 1 //T0中斷函數
  187. {
  188.         P2_1=~P2_1;
  189.         TH0=(6335-70000)/256;
  190.         TL0=(6335-70000)%256;
  191. }
  192. timer1()interrupt 3 using 2 //T1中斷函數
  193. {
  194.         display();
  195.         speed=0;
  196.        
  197. }
  198. main()
  199. {
  200. int a;
  201. EX0=1;
  202. IT0=1;
  203. EX1=1;
  204. IT1=1;
  205. P2_1=1;
  206. TMOD=0x61; //定時器T0方式1計時,計數器0方式0計數
  207. TH0=(6335-70000)/256;
  208. TL0=(6335-70000)%256;       
  209. TH1=256-10;
  210. TL1=256-10;
  211. EA=1;
  212. ET0=1;
  213. ET1=1;
  214. TR0=1;
  215. TR1=1;
  216. init();
  217. do
  218. {
  219. for(a=0;a<N*PWM_percent;a++)
  220. {
  221.         if(flag) k1=1;
  222.        
  223.         else k2=1;
  224. }
  225. for(a=0;a<N*(1-PWM_percent);a++)
  226. {
  227.         k1=k2=0;
  228. }
  229. }while(1);

  230. }

復制代碼


全部資料51hei下載地址:
第四組PWM電機調速系統.rar (618.66 KB, 下載次數: 244)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:712614 發表于 2020-4-13 22:06 | 只看該作者
下面是測試效果

51hei.png (48.91 KB, 下載次數: 28)

51hei.png

51hei.png (29.81 KB, 下載次數: 24)

51hei.png
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久新 | 一区二区三区视频在线观看 | 日日操网站 | 国产黄色av网站 | a在线免费观看视频 | 人人九九精 | 久草视频网站 | 天天操 夜夜操 | 亚洲视频一区在线观看 | 热re99久久精品国99热观看 | 免费黄篇 | 免费在线观看av的网站 | 亚洲国产一区在线 | 久久夜夜 | 日本电影免费完整观看 | 久久久久久久国产 | 一区二区精品 | 国产女人第一次做爰毛片 | av网站在线看 | 日韩中文一区 | 久艹av | 中文字幕在线第二页 | 国产成人自拍一区 | 在线观看成人小视频 | 99精品视频一区二区三区 | 国产精品亚洲片在线播放 | 欧美lesbianxxxxhd视频社区 | 日韩在线综合 | 欧美国产日韩在线观看成人 | 一区二区在线不卡 | 久久99国产精一区二区三区 | 91成人在线视频 | 国产激情一区二区三区 | 精国产品一区二区三区 | 在线国产一区 | 亚洲 成人 av | 婷婷成人在线 | 午夜影视网 | 91精品综合久久久久久五月天 | 欧美xxxx黑人又粗又长 | 精品一区二区三区在线观看 |