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

標題: 單片機直流電機PWM調(diào)速系統(tǒng)的設(shè)計與Proteus仿真工程 [打印本頁]

作者: Annalovecoding    時間: 2019-2-16 16:50
標題: 單片機直流電機PWM調(diào)速系統(tǒng)的設(shè)計與Proteus仿真工程



直流電機
PWM調(diào)速系統(tǒng)的設(shè)計與仿真

1本課題設(shè)計的目的和要求

              1.              直流電機PWM調(diào)速系統(tǒng)的目的:

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

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

       (3) 掌握電機PWM調(diào)速系統(tǒng)程序的設(shè)計和調(diào)試

       2. 直流電機PWM調(diào)速系統(tǒng)的要求

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

(2)設(shè)計電機驅(qū)動電路,根據(jù)輸入的占空比控制電機轉(zhuǎn)速。

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

(4)在PROTUES下仿真。



二、系統(tǒng)總體框圖與原理說明

              2.1 總體方案原理及設(shè)計框圖

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


總體方案設(shè)計框圖



三、硬件電路圖



              3.1 PWM產(chǎn)生方式

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

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

PWM波形圖

              設(shè)電機始終接通電路時,電機轉(zhuǎn)速最大為,設(shè)占空比為:

則電機的平均轉(zhuǎn)速為

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

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

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

                            PWM信號采用延時的方式產(chǎn)生,這樣實現(xiàn)比較容易,可以節(jié)約硬件成本。

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撥碼開關(guān)模塊的設(shè)計

              本設(shè)計輸入用4位的撥碼開關(guān),能產(chǎn)生16數(shù)值,每一種數(shù)值對應于一個占空比的值,當輸入為16時,最大的占空比為100%,能調(diào)節(jié)到最大的電機轉(zhuǎn)速。






3.3顯示模塊的設(shè)計

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




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

void lcd_show_str(unsigned char *str)

{


              while (*str != '\0')

              {

                            LED_data(*str++); //同一優(yōu)先級,先取內(nèi)容后自增

              }

}

因為要顯示測得的速度,而速度又是一個不止1位的整數(shù),所以必須分離速度的各個位數(shù)值并寫入LCD1602中。程序?qū)崿F(xiàn)如下。

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直流電機驅(qū)動模塊

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



3.3模擬直流電機測速模塊

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

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

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

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

              

MORTOR-ENCODER電機                    中斷引腳設(shè)置

3.4 電動機調(diào)速功能實現(xiàn)模塊

電動機調(diào)速功能分為以下四種:

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

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

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

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

{

              delay(5);                                          //消抖

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

              PWM_percent=PWM_percent*0.01;                                                                                                                       //將輸入的二進制數(shù)轉(zhuǎn)換成為占空比

}


3.5按鍵設(shè)計模塊

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

題目要求實現(xiàn)五種功能,



四、仿真說明

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

   


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

         

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

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

調(diào)節(jié)撥碼開關(guān)設(shè)置自定義占空比


按反轉(zhuǎn)鍵,電機反轉(zhuǎn)并在LCD中由Z變?yōu)镕

測速模塊

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



P3.1口輸出PWM波形




六、心得體會

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

  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. //****************************************************************************----延時小函數(shù)//
  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++); //同一優(yōu)先級,先取內(nèi)容后自增
  34.         }
  35. }
  36. void delay(uint z)//延時1ms函數(shù)
  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寫一字節(jié)(控制指令)
  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寫一字節(jié)(數(shù)據(jù))
  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. //****************************************************************************----功能區(qū)//

  116. void int0_isr(void)interrupt 0 //中斷0函數(shù)    和   它的流氓按鍵們
  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;                                                                       //將輸入的二進制數(shù)轉(zhuǎn)換成為占空比
  145. }

  146. if(P2_0==0)
  147. {       
  148.         delay(5);                                          //消抖
  149.         flag=~flag;                                                //反向加速
  150. }
  151. display_percent();                                    //每次調(diào)速后顯示
  152. LED_start(0xcf);
  153. if(flag) LED_data('Z');
  154. else LED_data('F');  
  155.        
  156. }
  157. void init()               //初始化函數(shù)
  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);              //第一行顯示轉(zhuǎn)速
  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函數(shù)
  183. {
  184. speed++;
  185. }
  186. timer0()interrupt 1 using 1 //T0中斷函數(shù)
  187. {
  188.         P2_1=~P2_1;
  189.         TH0=(6335-70000)/256;
  190.         TL0=(6335-70000)%256;
  191. }
  192. timer1()interrupt 3 using 2 //T1中斷函數(shù)
  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計時,計數(shù)器0方式0計數(shù)
  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電機調(diào)速系統(tǒng).rar (618.66 KB, 下載次數(shù): 244)


作者: 給我張床我能睡    時間: 2020-4-13 22:06
下面是測試效果

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

51hei.png

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

51hei.png





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩成人在线免费视频 | 97精品久久| 国产日韩精品视频 | 射久久 | 国产精品免费播放 | 颜色网站在线观看 | 精品国产一区二区在线 | 久久av网站 | 久久免费资源 | 日韩精品久久久久 | 亚洲国产成人精品久久 | 精品国产一区二区三区在线观看 | 久久福利电影 | 免费观看一级视频 | 中文字幕第一页在线 | 日韩精品一区在线 | 在线2区 | 中文字幕av在线播放 | av一区在线 | 中日韩av | 日本福利一区 | 成人精品啪啪欧美成 | 女人天堂av | 2023亚洲天堂 | av在线免费观看网站 | 中文字幕在线视频免费视频 | 一区二区三区视频在线 | 欧美日韩在线视频一区二区 | 伊人久久在线 | 欧美天堂 | 精品亚洲永久免费精品 | 欧洲一区二区在线 | 超碰免费在线 | 欧美videosex性极品hd | 一区二区手机在线 | 亚洲91精品 | 日韩国产精品一区二区三区 | 国产在线拍偷自揄拍视频 | av免费看在线 | 免费在线观看一区二区三区 | 福利视频一区 |