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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6095|回復: 2
收起左側

51單片機L298輸出PWM控制小直流電機旋轉,顯示轉速,占空比

[復制鏈接]
ID:724141 發表于 2020-6-22 21:19 | 顯示全部樓層 |閱讀模式
1. 根據小直流電機參數完成驅動電路的選型設計(使用L298芯片)
2. 用51單片機I/O腳產生控制信號,使用PWM控制小直流電機旋轉。
3. 產生兩種旋轉速度:快速,慢速。使用一個開關控制啟動和停止
4.顯示轉速,占空比

電路原理圖如下:
2.png 1.png

單片機源程序如下:
  1. #include "reg52.h"             //此文件中定義了單片機的一些特殊功能寄存器
  2. #include "lcd.h"

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

  5. #define uchar unsigned char
  6. #define uint unsigned int


  7. unsigned char code CDIS1[]={" duty cycle:   % "};
  8. unsigned char code CDIS2[]={"speed:     r/min "};

  9. /*******************************************************************************
  10. * 崔健
  11. * 17040101105
  12. *******************************************************************************/
  13. sbit num1=P1^0;  //占空比加1
  14. sbit num2=P1^1;  //占空比減一
  15. sbit num5=P1^7;  //開始停止切換


  16. sbit IN_1 = P3^0; /* L298的IN_1 */
  17. sbit IN_2 = P3^1; /* L298的IN_2 */

  18. sbit EN_A = P3^2; /* L298的EN_A */

  19. uint duty=50;
  20. uint pulse=0;
  21. uint time=0;
  22. uint mo=0;



  23. /**********電機驅動****************/   
  24. uchar count        = 0; /* 中斷計數器 */
  25. uint Speed_d = 0; /* 電機檔位 */
  26. uint Speed_1 = 0; /* 電機1/2速度值 */
  27. uint Speed_Now_1 = 0; /* 電機1/2當前速度值 */

  28. void delay(uint z)//延時1ms函數
  29. {
  30. uint x,y;
  31. for(x=0;x<z;x++)
  32.      for(y=0;y<110;y++);
  33. }

  34. void keyscan()  //鍵盤掃描函數
  35. {
  36.    
  37.   if(num1==0)     
  38.   {
  39.     delay(10);      //消除抖動
  40.     while(!num1);
  41.      if(duty<100)
  42.       duty=duty+5;
  43.      else duty=100;
  44.      
  45.   }
  46.   if(num2==0)
  47.   {
  48.     delay(10);
  49.     while(!num2);
  50.      if(duty>0)
  51.       duty=duty-5;
  52.      else duty=0;
  53.          
  54.   }
  55.       
  56.   if(num5==0)
  57.   {
  58.     delay(5);
  59.         while(!num5);
  60.         if(mo==0){
  61.             EN_A = 1;
  62.             IN_2 = 0;
  63.             mo=1;
  64.         }
  65.         else{
  66.             EN_A=0;
  67.             IN_2=0;
  68.             mo=0;
  69.         }
  70.   }
  71.    
  72.   
  73. }

  74. void LcdDisplay(uint pulse)      //lcd顯示
  75. {
  76.    
  77.       unsigned int datas[] = {0, 0, 0, 0, 0}; //定義數組
  78.    
  79.     LcdWriteCom(0x8c);         //寫地址 80表示初始地址
  80.     LcdWriteData(duty/10+0x30); //顯示占空比十位
  81.     LcdWriteCom(0x8d);         
  82.     LcdWriteData(duty%10+0x30); //顯示占空比個位
  83.    
  84.     Speed_1=pulse*3;//  (脈沖數/20)*(60)=圈數x一分鐘時間
  85.    
  86.     datas[0] = Speed_1 / 10000;
  87.     datas[1] = Speed_1 % 10000 / 1000;
  88.     datas[2] = Speed_1 % 1000 / 100;
  89.     datas[3] = Speed_1 % 100 / 10;
  90.     datas[4] = Speed_1 % 10;
  91.    
  92.     LcdWriteCom(0x86+0x40);//第二行顯示轉速
  93.     if(datas[0]!=0)
  94.    LcdWriteData(datas[0]+'0');
  95.     else
  96.    LcdWriteData(' ');
  97.         
  98.     LcdWriteCom(0x87+0x40); //顯示速度千位
  99.     LcdWriteData('0'+datas[1]);  

  100.     LcdWriteCom(0x88+0x40); //顯示速度百位
  101.     LcdWriteData('0'+datas[2]);
  102.    
  103.     LcdWriteCom(0x89+0x40); //顯示速度十位
  104.     LcdWriteData('0'+datas[3]);
  105.    
  106.     LcdWriteCom(0x8a+0x40); //顯示速度個位
  107.     LcdWriteData('0'+datas[4]);
  108. }

  109. void Timer0Init()        //12.000MHz
  110. {
  111.     TMOD = 0x01;        
  112.     TH0 = 0x0FF;//定時10us
  113.    TL0 = 0x0F6;
  114.    EA = 1;
  115.    ET0 = 1;
  116.    TR0 = 1;
  117.    
  118.     IT1=1;//跳變沿出發方式(下降沿)
  119.     EX1=1;//打開INT1的中斷允許。
  120.    
  121.     EN_A = 0;
  122.     IN_2 = 0;
  123.     IN_2 = 0;
  124. }
  125. void InitTimer1(void)
  126. {
  127.     //定時1ms
  128.     TMOD = 0x10;
  129.      TH1 = 0x0D8;
  130.     TL1 = 0x0F0;
  131.     EA = 1;
  132.     ET1 = 1;
  133.     TR1 = 1;
  134. }


  135. void Motor(uint duty,uchar direction)
  136. {
  137.      if(direction == 1)
  138.      {
  139.                 Speed_1 = duty;

  140.      }
  141.      else
  142.      {
  143.                 Speed_1 = duty;  
  144.      }              
  145. }


  146. void TIME_0(void) interrupt 1 /* T0中斷產生pwm */
  147. {
  148.     //定時10us
  149.      TH0 = 0x0FF;
  150.     TL0 = 0x0F6;
  151.          if(count == 0) /* 1個PWM周期完成后才會接受新數值 */
  152.         {        
  153.                 Speed_d = duty;
  154.          
  155.         }
  156.         /* 產生電機1的PWM信號 */
  157.         if(count < Speed_d) IN_1 = 1;
  158.         else IN_1 = 0;  
  159.         
  160.         count++;
  161.         if(count >= 100)
  162.               count = 0; /* 1個PWM信號由100次中斷產 */     

  163. }

  164. void Int1()    interrupt 2        //外部中斷1的中斷函數
  165. {
  166.     pulse++;  //外部中斷1記錄電機的轉速 電機轉一圈pulse加一
  167. }


  168. void Timer1Interrupt(void) interrupt 3 /* T1記錄轉速 */
  169. {
  170.     //定時1ms
  171.      TH1 = 0x0D8;
  172.     TL1 = 0x0F0;
  173.      time++;
  174.    
  175.      if(time==100)                                   //計時到達1s
  176.     {
  177.           LcdDisplay(pulse);     //顯示轉速
  178.         pulse=0;                                          //轉速置0
  179.         time=0;
  180.         }
  181.    
  182. }


  183. void main(void)
  184. {
  185.     u8 i;

  186.     LcdInit();
  187.     Timer0Init();
  188.     InitTimer1();
  189.    
  190.    LcdWriteCom(0x80);//第一行顯示占空比
  191.     for(i=0;i<18;i++)
  192.     {
  193.         LcdWriteData(CDIS1[i]);   
  194.     }
  195.     LcdWriteCom(0x80+0x40);//第二行顯示轉速
  196.     for(i=0;i<18;i++)
  197.     {
  198.         LcdWriteData(CDIS2[i]);   
  199.     }

  200.     while(1)
  201.         {
  202.             
  203.          keyscan();                                //鍵盤掃描程序            
  204.     }               
  205. }

復制代碼

所有程序51hei提供下載(仿真文件不提供,請自己畫):
L298輸出PWM控制電機轉速.zip (59.38 KB, 下載次數: 105)
回復

使用道具 舉報

ID:495287 發表于 2020-7-5 13:08 | 顯示全部樓層
五一電機快慢跑
IO控制正反妙
多點耐心與調試
智能轉速顯示鳥!
回復

使用道具 舉報

ID:328014 發表于 2020-7-5 13:42 | 顯示全部樓層
Jeff_BlindCat 發表于 2020-7-5 13:08
五一電機快慢跑,
IO控制正反妙,
多點耐心與調試,

我是特意來看詩歌的哦
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人超碰在线 | 国产成人免费 | 中文字幕乱码一区二区三区 | 欧美一区二区三区视频在线观看 | 日韩午夜一区二区三区 | 免费在线一区二区 | 久久精品黄色 | 久久丝袜 | 国产一区精品在线 | 亚洲欧美aⅴ | 亚洲综合二区 | 精品九九| 日本高清不卡视频 | 欧美日韩精品中文字幕 | 国产成人99久久亚洲综合精品 | 亚洲一区在线播放 | 久久精品色欧美aⅴ一区二区 | 欧美精品综合在线 | 国内精品久久影院 | 波多野结衣一区二区三区 | 四虎影院新网址 | 91免费在线看 | 日韩免费高清视频 | www.久久精品 | 中文在线а√在线8 | 亚洲人成人一区二区在线观看 | 免费一级欧美在线观看视频 | 亚洲 中文 欧美 日韩 在线观看 | 欧美一级高清片 | 国产一区二区影院 | 一级毛片色一级 | 色视频www在线播放国产人成 | 亚洲一区二区中文字幕 | 黄色亚洲网站 | 欧美激情 一区 | 国产夜恋视频在线观看 | 在线免费观看成年人视频 | 91最新在线视频 | 黄色a三级 | hsck成人网 | 国产免费av在线 |