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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機PWM直流電機調速顯示轉速 PCB封裝庫+程序+電路

  [復制鏈接]
跳轉到指定樓層
樓主
PWM直流電機調速仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


Altium Designer畫的PWM直流電機調速原理圖和PCB圖如下:(51hei附件中可下載工程文件)


里面包含PCB封裝庫文件:


PWM直流電機調速單片機程序如下
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include "LCD1602.h"

  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. /**********端口分配*******************************/
  7. sbit add_key=P1^0;  //占空比加
  8. sbit dec_key=P1^1;  //占空比減
  9. sbit z_key=P1^2;  //正轉鍵
  10. sbit f_key=P1^3;  //反轉鍵
  11. sbit run_key=P1^4; //啟動/停止鍵
  12.                   
  13. sbit beep=P3^2;
  14. //電機驅動相關
  15. sbit ENA=P3^5;
  16. sbit IN1=P3^7;
  17. sbit IN2=P3^4;
  18. /**********變量定義*******************************/
  19. //電機相關定義
  20. bit Rotation_f=0;  //步進電機旋轉狀態標志  為0正轉  1反轉

  21. bit power_flag=0;  //總開關標志

  22. #define  PWM_cnt_LEN 100  //計數全長
  23. #define PWM_ON  1        //開  
  24. #define PWM_OFF 0        //關
  25. uint PWM_cnt;  //PWM計數
  26. uchar PWM_duty;  //PWM占空比

  27. uint speed_cnt=0;  //轉速
  28. uint speed_value;
  29. bit dis_speed_flag=0;
  30. uint delay_cnt;
  31. uchar dis_buf[6];
  32. uchar dis_cnt;
  33. uchar dis_buf1[4];
  34. uchar dis_cnt1;
  35. /*********定義延時1ms子程序************************/
  36. void delay1ms(uint t)//1ms延時子程序
  37. {
  38.     uint k,j;
  39.         for(k=0;k<t;k++)
  40.                 for(j=0;j<120;j++);
  41. }
  42. /**************************************************/
  43. /**********蜂鳴器報警**********************/
  44. void beep_alarm()
  45. {
  46.         beep=0;
  47.         delay1ms(100);
  48.         beep=1;
  49. }
  50. /*******************************************/
  51. /**********電機停止********************/
  52. void motor_stop()
  53. {
  54.         IN1=1;
  55.         IN2=1;
  56. }
  57. /***************************************/
  58. /*******電機正轉********************/
  59. void motor_foreward()
  60. {
  61.         IN1=1;
  62.         IN2=0;
  63. }
  64. /************************************/
  65. /********電機反轉**********************/
  66. void motor_reversal()
  67. {
  68.         IN1=0;
  69.         IN2=1;
  70. }
  71. /*****************************************/
  72. /************顯示轉速*********************/
  73. void dis_speed()
  74. {
  75.         dis_cnt=0;
  76.         if(speed_value/10000!=0)
  77.         {
  78.                 dis_buf[dis_cnt]=speed_value/10000+0x30;
  79.                 dis_cnt++;
  80.                 dis_buf[dis_cnt]=speed_value%10000/1000+0x30;
  81.                 dis_cnt++;
  82.                 dis_buf[dis_cnt]=speed_value%1000/100+0x30;
  83.                 dis_cnt++;
  84.                 dis_buf[dis_cnt]=speed_value%100/10+0x30;
  85.                 dis_cnt++;
  86.                 dis_buf[dis_cnt]=speed_value%10+0x30;
  87.                 dis_cnt++;
  88.         }
  89.         else if(speed_value%10000/1000!=0)
  90.         {
  91.                 dis_buf[dis_cnt]=' ';
  92.                 dis_cnt++;
  93.                 dis_buf[dis_cnt]=speed_value%10000/1000+0x30;
  94.                 dis_cnt++;
  95.                 dis_buf[dis_cnt]=speed_value%1000/100+0x30;
  96.                 dis_cnt++;
  97.                 dis_buf[dis_cnt]=speed_value%100/10+0x30;
  98.                 dis_cnt++;
  99.                 dis_buf[dis_cnt]=speed_value%10+0x30;
  100.                 dis_cnt++;
  101.         }
  102.         else if(speed_value%1000/100!=0)
  103.         {
  104.                 dis_buf[dis_cnt]=' ';
  105.                 dis_cnt++;
  106.                 dis_buf[dis_cnt]=' ';
  107.                 dis_cnt++;
  108.                 dis_buf[dis_cnt]=speed_value%1000/100+0x30;
  109.                 dis_cnt++;
  110.                 dis_buf[dis_cnt]=speed_value%100/10+0x30;
  111.                 dis_cnt++;
  112.                 dis_buf[dis_cnt]=speed_value%10+0x30;
  113.                 dis_cnt++;
  114.         }
  115.         else if(speed_value%100/10!=0)
  116.         {
  117.                 dis_buf[dis_cnt]=' ';
  118.                 dis_cnt++;
  119.                 dis_buf[dis_cnt]=' ';
  120.                 dis_cnt++;
  121.                 dis_buf[dis_cnt]=' ';
  122.                 dis_cnt++;
  123.                 dis_buf[dis_cnt]=speed_value%100/10+0x30;
  124.                 dis_cnt++;
  125.                 dis_buf[dis_cnt]=speed_value%10+0x30;
  126.                 dis_cnt++;
  127.         }
  128.         else
  129.         {
  130.                 dis_buf[dis_cnt]=' ';
  131.                 dis_cnt++;
  132.                 dis_buf[dis_cnt]=' ';
  133.                 dis_cnt++;
  134.                 dis_buf[dis_cnt]=' ';
  135.                 dis_cnt++;
  136.                 dis_buf[dis_cnt]=' ';
  137.                 dis_cnt++;
  138.                 dis_buf[dis_cnt]=speed_value%10+0x30;
  139.                 dis_cnt++;
  140.         }
  141.         dis_buf[dis_cnt]='\0';
  142.         LCD1602_Print(2,0,dis_buf);        //顯示轉速
  143. }
  144. /*****************************************/
  145. /**********顯示占空比*********************/
  146. void dis_duty()
  147. {
  148.     dis_cnt1=0;
  149.         if(PWM_duty/100!=0)
  150.         {
  151.                 dis_buf1[dis_cnt1]=PWM_duty/100+0x30;
  152.                 dis_cnt1++;
  153.                 dis_buf1[dis_cnt1]=PWM_duty%100/10+0x30;
  154.                 dis_cnt1++;
  155.                 dis_buf1[dis_cnt1]=PWM_duty%10+0x30;
  156.                 dis_cnt1++;
  157.         }
  158.         else if(PWM_duty%100/10!=0)
  159.         {
  160.                 dis_buf1[dis_cnt1]=' ';
  161.                 dis_cnt1++;
  162.                 dis_buf1[dis_cnt1]=PWM_duty%100/10+0x30;
  163.                 dis_cnt1++;
  164.                 dis_buf1[dis_cnt1]=PWM_duty%10+0x30;
  165.                 dis_cnt1++;
  166.         }
  167.         else
  168.         {
  169.                 dis_buf1[dis_cnt1]=' ';
  170.                 dis_cnt1++;
  171.                 dis_buf1[dis_cnt1]=' ';
  172.                 dis_cnt1++;
  173.                 dis_buf1[dis_cnt1]=PWM_duty%10+0x30;
  174.                 dis_cnt1++;
  175.         }
  176.         dis_buf1[dis_cnt1]='\0';
  177.         LCD1602_Print(9,1,dis_buf1);        //顯示占空比
  178. }
  179. /*****************************************/
  180. /*************定時器初始化程序*******************/
  181. void timer_init(void)  
  182. {
  183.         TMOD=0x11; //設置定時器0,1為16位模式
  184.         TH0=0xD8;  //10ms定時初值         10ms  D8F0           
  185.         TL0=0xF0;
  186.         ET0=1;     //定時器0中斷開
  187.         TR0=1;     //開定時器0

  188.         TH1=0xFF;  //100us定時初值
  189.         TL1=0x9C;
  190.         ET1=1;     //定時器1中斷開
  191.         TR1=1;     //開定時器1
  192.         EA=1;      //總中斷開
  193. }
  194. /*************************************************/
  195. /***********定時器0中斷服務程序*******************/
  196. void timer0(void) interrupt 1  
  197. {
  198.         TH0=0xD8;  //10ms定時初值 10ms  D8F0
  199.         TL0=0xF0;
  200.         delay_cnt++;
  201.         if(delay_cnt>=200)  //2S計時
  202.         {
  203.                 delay_cnt=0;
  204.                 speed_value=speed_cnt*30;  //30  將兩秒內的計數乘以30得到轉每分          (還要除2  因為有兩片磁鐵)  30/2=15
  205.                 speed_cnt=0;
  206.                 dis_speed_flag=1;
  207.         }
  208. }
  209. /*************************************************/
  210. /**********外部中斷1服務程序**************/
  211. void int1() interrupt 2
  212. {
  213.         speed_cnt++;  //轉速
  214. }
  215. /*****************************************/
  216. /***********定時器1中斷服務程序*******************/
  217. void timer1(void) interrupt 3  
  218. {
  219.         TH1=0xFF;  //100us定時初值
  220.         TL1=0x9C;
  221.         if(++PWM_cnt==PWM_cnt_LEN)
  222.         {
  223.                 PWM_cnt=0;
  224.                 if(power_flag==1)
  225.                         ENA=PWM_ON;
  226.                 else ENA=PWM_OFF;

  227.         }
  228.         if(PWM_cnt==PWM_duty)
  229.         {
  230.                 ENA=PWM_OFF;
  231.         }
  232. }
  233. /*************************************************/
  234. /*******按鍵處理程序******************************/
  235. void key_check()
  236. {
  237.         if(add_key==0)  //占空比加
  238.         {
  239.                 delay1ms(50);
  240.                 if(add_key==0)
  241.                 {
  242.                     beep_alarm(); //蜂鳴器報警
  243.                         PWM_duty++;
  244.                         if(PWM_duty>100)
  245.                                 PWM_duty=100;
  246.                         dis_duty(); //顯示占空比
  247.                 }
  248.         }
  249.         if(dec_key==0)  //占空比減
  250.         {
  251.                 delay1ms(50);
  252.                 if(dec_key==0)
  253.                 {
  254.                     beep_alarm(); //蜂鳴器報警
  255.                         PWM_duty--;
  256.                         if(PWM_duty>100)
  257.                                 PWM_duty=0;
  258.                         dis_duty(); //顯示占空比
  259.                 }
  260.         }
  261.         if(z_key==0)  //正轉鍵
  262.         {
  263.                 delay1ms(50);
  264.                 if(z_key==0)
  265.                 {
  266.                     beep_alarm(); //蜂鳴器報警
  267.                         Rotation_f=0;  //步進電機旋轉狀態標志  為0正轉  1反轉
  268.                         LCD1602_Print(12,0,"pros");
  269.                         motor_stop();//電機停止
  270.                         delay1ms(1);
  271.                         motor_foreward();  //電機正轉
  272.                 }
  273.         }
  274.         if(f_key==0)  //反轉鍵
  275.         {
  276.                 delay1ms(50);
  277.                 if(f_key==0)
  278.                 {
  279.                     beep_alarm(); //蜂鳴器報警
  280.                     Rotation_f=1;  //步進電機旋轉狀態標志  為0正轉  1反轉
  281.                         LCD1602_Print(12,0,"cons");
  282.                         motor_stop();//電機停止
  283.                         delay1ms(1);
  284.                         motor_reversal(); //電機反轉
  285.                 }
  286.         }
  287.     if(run_key==0) //啟動/停止鍵
  288.         {
  289.                 delay1ms(50);
  290.                 if(run_key==0)
  291.                 {
  292.                     beep_alarm(); //蜂鳴器報警
  293.             power_flag=~power_flag;  //總開關標志
  294.                         if(power_flag==1)
  295.                         {
  296.                             if(Rotation_f==0)  //步進電機旋轉狀態標志  為0正轉  1反轉
  297.                                 {
  298.                                         motor_stop();//電機停止
  299.                                         delay1ms(1);
  300.                                         motor_foreward();  //電機正轉
  301.                                 }
  302.                                 else
  303.                                 {
  304.                                         motor_stop();//電機停止
  305.                                         delay1ms(1);
  306.                                         motor_reversal(); //電機反轉
  307.                                 }
  308.                         }
  309.                         else motor_stop();  //電機停止
  310.                         while(!run_key);//等待按鍵釋放
  311.                 }
  312.         }
  313. }
  314. /*************************************************/
  315. /**********************主函數*********************/
  316. void main()
  317. {
  318.     PWM_duty=50;  //PWM占空比
  319.     timer_init();  //定時器初始化程序
  320.         EX1=1;
  321.         IT1=1;
  322.         LCD1602_init(); //LCD1602液晶初始化
  323.         LCD1602_Print(0,0,"V:    0rpm  pros");
  324.         LCD1602_Print(0,1,"PWM_duty:  0    ");      
  325.         dis_duty(); //顯示占空比
  326.         while(1)
  327.         {
  328.             key_check(); //按鍵處理程序
  329.                 if(dis_speed_flag==1)
  330.                 {
  331.                         dis_speed(); //顯示轉速
  332.                         dis_speed_flag=0;
  333.                 }

  334.         }
  335. }
  336. /**************************************************/
復制代碼



全部資料51hei下載地址:
PWM直流電機調速顯示轉速.7z (11.63 MB, 下載次數: 462)

                                

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:665669 發表于 2019-12-16 22:30 | 只看該作者
哇,剛好找到,太棒了
回復

使用道具 舉報

板凳
ID:657088 發表于 2019-12-17 10:43 來自手機 | 只看該作者
厲害,大佬求指教
回復

使用道具 舉報

地板
ID:298008 發表于 2020-3-2 10:46 | 只看該作者
謝謝樓主分享!!!
回復

使用道具 舉報

5#
ID:697141 發表于 2020-3-20 11:05 | 只看該作者
太棒了
回復

使用道具 舉報

6#
ID:741655 發表于 2020-4-30 13:35 | 只看該作者
proteus仿真文件夾中的文件怎么打開啊,我用proteus好像打開不了
回復

使用道具 舉報

7#
ID:745048 發表于 2020-5-7 08:29 | 只看該作者
proteus仿真文件夾中的文件怎么打開啊,我用proteus好像打開不了
回復

使用道具 舉報

8#
ID:741333 發表于 2020-5-7 14:35 | 只看該作者
測速傳感器在哪呢
回復

使用道具 舉報

9#
ID:684850 發表于 2020-6-1 18:57 | 只看該作者
測速的原理是什么,我不太懂

回復

使用道具 舉報

10#
ID:961114 發表于 2024-5-17 10:55 | 只看該作者
為啥你們還搗鼓軟件仿真  STC8H8K64U帶硬件USB直接下載 直接仿真 多好啊   
回復

使用道具 舉報

11#
ID:344848 發表于 2024-5-17 13:50 | 只看該作者
袁翼遙 發表于 2020-5-7 14:35
測速傳感器在哪呢

A3144E霍爾傳感器測速
回復

使用道具 舉報

12#
ID:344848 發表于 2024-5-17 13:51 | 只看該作者
luchengzhiyou 發表于 2020-6-1 18:57
測速的原理是什么,我不太懂

利用霍爾傳感器A3144E測速
回復

使用道具 舉報

13#
ID:433219 發表于 2024-5-17 15:37 | 只看該作者
L298 做直流電機驅動,太浪費的設計吧
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产免费拔擦拔擦8x高清 | 久久成人av电影 | 国产精品久久网 | 国产黄色精品在线观看 | 国产日韩久久 | 亚洲不卡在线观看 | 国产观看| 国产精品久久九九 | 欧美日韩高清在线观看 | 91久久精品视频 | 91黄在线观看 | 成人免费看电影 | 成人亚洲性情网站www在线观看 | 粉嫩在线 | 久久久成人一区二区免费影院 | av网站在线看 | 曰韩三级 | 高清成人av | 国产亚洲欧美在线视频 | 久久久久久成人网 | 久草99| 国产 欧美 日韩 一区 | 亚洲国产一区二区三区四区 | 日韩精品一区二区久久 | 精品1区2区3区4区 | 高清一区二区 | 亚洲激精日韩激精欧美精品 | 久久99一区二区 | 国产免费一区二区 | 亚洲一区国产 | 成人h电影在线观看 | 天堂中文在线播放 | 99福利在线观看 | 在线观看第一区 | 九九在线视频 | 久久久精品 | 欧美激情一区二区 | 国产精品视屏 | 国产视频黄色 | 草b视频 | 天天干狠狠操 |