找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機接收PWM顯示轉速問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:1084208 發(fā)表于 2023-7-30 15:12 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
下面有兩塊板,綠色的數碼管是顯示轉速的,紅色的數碼管是顯示clock信號的,也就是顯示頻率的,比如當紅色的數碼管手動調到200Hz時,綠色數碼管就要顯示800轉速,這是個假設,不一定只顯示800轉,看電機是幾對極來計算,現在綠色數碼管的板子上引了一根通訊線與紅色數碼管的PWM線相連,打算用這根線來接收紅色數碼管通訊線的脈沖,然后將他轉換得到轉速顯示在綠色數碼管上,目前我需要知道一個思路,因為我寫出來的沒有實現出來,請大伙給個思路或函數框架。

51hei圖片_20230730151138.jpg (2.97 MB, 下載次數: 71)

51hei圖片_20230730151138.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:213173 發(fā)表于 2023-7-30 21:56 | 只看該作者
適用于1000轉/分鐘以內
  1. #include <reg51.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define ulong unsigned long
  6. #define DASE 60000

  7. //全局變量聲明
  8. //                     數據頭 方向位  高位  低位  驗證  數據尾
  9. uchar data dis_buf[6]={ 0xaa,  0x00,  0x00, 0x00, 0xff,  0x55 };
  10. uint  D_num;            //定時器中斷計數變量
  11. uint  speed=0;          //轉速
  12. uint  temp=0;           //T0中斷計數臨時變量                                       
  13. uint  count=0;                        //主循環(huán)計數變量
  14. uchar flag_Z=0;         //外部中斷標志
  15. bit   flag_D=0;         //T0中斷標志
  16. //---本地函數聲明---//
  17. void Timer0Init();      //定時器T0初始化
  18. void UartInit();        //定時器T1初始化波特率
  19. void Delay_ms(uint t);  //延時函數

  20. //主函數
  21. void main()
  22. {
  23.         uchar k;
  24.         Timer0Init();                        //初始化定時器0
  25.         UartInit();                                //初始化定時器1波特率發(fā)生器
  26.         Delay_ms(100);                        //長延時100ms
  27.         IE0 = 0;                                //INT0中斷請求標志清0
  28.         IT0 = 1;                                //設置外部下降沿中斷
  29.         EX0 = 1;                                //開INT0中斷
  30.         ET0 = 1;                                //開T0中斷
  31.         EA  = 1;                                //開總中斷
  32.         Delay_ms(100);                        //長延時100ms
  33.         flag_Z=0;                                //外部中斷標志初始0,消除加電時外部中斷的一次觸發(fā)
  34.         while(1)
  35.         {
  36.                 if(flag_D==1)                                        //定時器中斷250ms
  37.                 {
  38.                         flag_D=0;                                        //定時器中斷標志清0
  39.                         count++;                                        //250ms計數++
  40.                         if(flag_Z==3)                                //外部中斷標志
  41.                         {
  42.                                 flag_Z=2;                                //外部中斷標志復位
  43.                                 speed=DASE/D_num;                //計算轉速 r/min
  44.                                 dis_buf[2]=speed>>8;        //轉速高8位
  45.                                 dis_buf[3]=speed;                //轉速低8位
  46.                                 count=0;                                //250ms計數清0
  47.                         }
  48.                         else if(count>24)                        //否則 如果持續(xù)6秒收不到外部中斷信號清一次所有信息
  49.                         {
  50.                                 count=0;
  51.                                 speed=0;                                //轉速清0
  52.                                 dis_buf[2]=0x00;                //轉速高位緩存清0
  53.                                 dis_buf[3]=0x00;                //轉速低位緩存清0
  54.                                 D_num=0;                                //定時器中斷緩存清0
  55.                                 temp=0;                                        //定時器中斷變量清0
  56.                                 flag_Z=0;                        //外部中斷標志清0
  57.                         }
  58.                         dis_buf[4]=dis_buf[0]+dis_buf[1]+dis_buf[2]+dis_buf[3]+dis_buf[5];//計算驗證碼
  59.                         for(k=0;k<6;k++)
  60.                         {
  61.                                 SBUF = dis_buf[k];                //串口發(fā)送數據串
  62.                                 while(!TI);                                //等待串口發(fā)送中斷請求標志位為1
  63.                                 TI=0;                                        //串口發(fā)送中斷請求標志清0
  64.                         }
  65.                 }
  66.         }
  67. }   
  68. //T0中斷服務函數 周期1ms
  69. void Timer0Interrupt() interrupt 1
  70. {
  71.         static uint i;
  72.         temp++;
  73.         i++;
  74.         if(i>=250)                                //250ms
  75.         {
  76.                 i=0;
  77.                 flag_D=1;                        //T0中斷標志
  78.         }
  79. }
  80. //INT0中斷服務函數
  81. void INT0_Isr() interrupt 0
  82. {
  83.         TR0=0;                                        //關定時器0
  84.         D_num=temp;                                //讀取定時器1ms中斷計數值
  85.         temp=0;                                        //定時器1ms中斷計數值清0
  86.         TL0 = 0x66;                                //設置定時初始值
  87.         TH0 = 0xfc;                                //設置定時初始值
  88.         TR0=1;                                        //開定時器0
  89.         if(++flag_Z>=3)                        //判斷外部(霍爾)中斷,用于起步消除錯誤計數               
  90.                 flag_Z=3;
  91. }
  92. //延時函數
  93. void Delay_ms(uint t)                //@11.0592MHz
  94. {
  95.         uint i,j;
  96.         for(i=t;i>0;i--)
  97.                 for(j=110;j>0;j--);
  98. }
  99. //初始化定時器T0
  100. void Timer0Init()                        //1毫秒@11.0592MHz
  101. {
  102.         TMOD|= 0x01;                        //設置定時器16位自動重載模式
  103.         TL0 = 0x66;                                //設置定時初始值
  104.         TH0 = 0xfc;                                //設置定時初始值
  105.         TF0 = 0;                                //清除TF0標志
  106.         TR0 = 1;                                //定時器0開始計時
  107. }
  108. //初始化串口T1
  109. void UartInit()                                //9600bps@11.0592MHz
  110. {
  111.         SCON = 0x50;                        //8位數據,可變波特率
  112.         TMOD|= 0x20;                        //設置定時器模式
  113.         TL1 = 0xfd;                                //設置定時初始值
  114.         TH1 = 0xfd;                                //設置定時初始值
  115.         ET1 = 0;                                //禁止定時器中斷
  116.         TR1 = 1;                                //定時器1開始計時
  117. }
復制代碼



回復

使用道具 舉報

板凳
ID:320306 發(fā)表于 2023-7-31 09:20 | 只看該作者
你需要把控制電機的PWM信號變成頻率信號調節(jié)電機的速度 頻率是不變的,所以你目前應該不行,要么用程序,采集占空比輸出頻率也可以!要么就直接用單片機驅動兩個數碼管顯示,然后單片機輸出PWM控制最簡單。
回復

使用道具 舉報

地板
ID:123289 發(fā)表于 2023-7-31 16:20 | 只看該作者
這是硬件問題。需要一個PWM電壓與轉速的對應關系。這個關系與硬件相關,你能找出這個關系嗎。
認真讀相關硬件的手冊吧。尤其是電機。
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表