找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2104|回復: 7
收起左側

如何用stm32F1控制舵機和電機,兩個程序怎樣放在一起

[復制鏈接]
ID:950534 發(fā)表于 2021-7-31 09:37 | 顯示全部樓層 |閱讀模式
如題
回復

使用道具 舉報

ID:808821 發(fā)表于 2021-8-1 11:23 | 顯示全部樓層
F1的單片機是啥型號的?  只要定時器夠用 就可以 ,舵機的周期是20ms  應該和電機的頻率(k以上)差很多  ,不能用同一個定時器 。第一次回帖。
回復

使用道具 舉報

ID:949088 發(fā)表于 2021-8-1 11:30 | 顯示全部樓層
用一個可以固定頻率固定個數(shù)的pwm波控制,最好寫成函數(shù)的形式
回復

使用道具 舉報

ID:161164 發(fā)表于 2021-8-1 13:46 | 顯示全部樓層
除了主循環(huán)外,不要用while
少用for
不要用delay

例:現(xiàn)有三個程序想把他們合起來
程序A:


  1. void main()//一秒閃燈程序
  2. {
  3.         while(1)
  4.         {
  5.                 Led = 0;
  6.                 delayms(1000);
  7.                 Led = 1;
  8.                 delayms(1000);
  9.         }
  10. }
復制代碼


程序B:

  1. void main()//八位數(shù)碼管動態(tài)掃描程序
  2. {char i;
  3.         while(1)
  4.         {
  5.                 for(i=0;i<8;i++)
  6.                 {
  7.                         P1=0xFF;
  8.                         P2=SegDis[DateTime[i]];
  9.                         P1=TubeSel[i];
  10.                         delayms(5);                       
  11.                 }
  12.         }
  13. }
復制代碼


和程序C:

  1. void main()//按鍵掃描程序
  2. {char i;
  3.         while(1)
  4.         {
  5.                 if(Key==0)//有鍵按下
  6.                 {
  7.                         delayms(10);//消抖
  8.                         if(Key==0)
  9.                         {
  10.                                 while(Key==0);//等待放開
  11.                                 //你的程序
  12.                         }
  13.                 }
  14.         }
  15. }
復制代碼


因為程序A的delayms時間很長所以不能用
而程序C的while(Key==0);等鍵放開也會影響其它程序

更改方法如下
程序A:


  1. int delayms1=0;
  2. void main()//一秒閃燈程序
  3. {
  4. char state=0;
  5.         while(1)
  6.         {
  7.                 if(!delayms1)
  8.                 {delayms1=1000;
  9.                         switch (state)
  10.                         {
  11.                                 case 0:
  12.                                         Led = 0;
  13.                                         state = 1;
  14.                                         break;
  15.                                 case 1:
  16.                                         Led = 1;
  17.                                         state = 0;
  18.                                         break;
  19.                                 default:
  20.                                         break;
  21.                         }
  22.                 }else
  23.                 {
  24.                         delayms1--;//如需準確定時,可放于定時中斷中進行
  25.                 }
  26.         }
  27. }
復制代碼


程序B:
  1. int delayms2=0;
  2. void main()//八位數(shù)碼管動態(tài)掃描程序
  3. {
  4.         char i=0;
  5.         while(1)
  6.         {
  7.                 if(!delayms2)
  8.                 {delayms2=5;
  9.                         P1=0xFF;
  10.                         P2=SegDis[DateTime[i]];
  11.                         P1=TubeSel[i];
  12.                         i++;
  13.                         if(i=8)
  14.                         {
  15.                                 i=0;
  16.                         }
  17.                 }else
  18.                 {
  19.                         delayms2--;//如需準確定時,可放于定時中斷中進行
  20.                 }
  21.         }
  22. }
復制代碼


和程序C:
  1. int delayms3=0;
  2. void main()//按鍵掃描程序
  3. {
  4.         char count=0;
  5.         char keysta = 0;
  6.         while(1)
  7.         {
  8.                 if(!delayms3)
  9.                 {delayms3=2;
  10.                         switch (keysta)
  11.                         {
  12.                                 case 0:
  13.                                         if(Key==0)//有鍵按下
  14.                                         {
  15.                                                 if(++count>5)//消抖
  16.                                                 {
  17.                                                         keysta=1;                                                       
  18.                                                 }
  19.                                         }else
  20.                                         {
  21.                                                 count=0;
  22.                                         }
  23.                                         break;
  24.                                 case 1:                                       
  25.                                         if(Key==1)//等待放開
  26.                                         {
  27.                                                 keysta=0;
  28.                                                 //你的程序
  29.                                         }
  30.                                         break;
  31.                                 default:
  32.                                         break;
  33.                         }
  34.                 }else
  35.                 {
  36.                         delayms3--;//如需準確定時,可放于定時中斷中進行
  37.                 }
  38.         }
  39. }
復制代碼

這樣改法,合起來時就不會互相影響

回復

使用道具 舉報

ID:950534 發(fā)表于 2021-8-1 20:22 | 顯示全部樓層
lkc8210 發(fā)表于 2021-8-1 13:46
除了主循環(huán)外,不要用while
少用for
不要用delay

受教了,謝謝
回復

使用道具 舉報

ID:950534 發(fā)表于 2021-8-1 20:22 | 顯示全部樓層
liurongbao 發(fā)表于 2021-8-1 11:23
F1的單片機是啥型號的?  只要定時器夠用 就可以 ,舵機的周期是20ms  應該和電機的頻率(k以上)差很多   ...

好的,我試試,謝謝
回復

使用道具 舉報

ID:950534 發(fā)表于 2021-8-1 20:22 | 顯示全部樓層
liurongbao 發(fā)表于 2021-8-1 11:23
F1的單片機是啥型號的?  只要定時器夠用 就可以 ,舵機的周期是20ms  應該和電機的頻率(k以上)差很多   ...

好的,我試試,謝謝
回復

使用道具 舉報

ID:950534 發(fā)表于 2021-8-1 20:23 | 顯示全部樓層
khjkhjhkj 發(fā)表于 2021-8-1 11:30
用一個可以固定頻率固定個數(shù)的pwm波控制,最好寫成函數(shù)的形式

回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

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