找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1769|回复: 7
打印 上一主题 下一主题
收起左侧

如何用stm32F1控制舵机和电机,两个程序怎样放在一起

[复制链接]
跳转到指定楼层
楼主
ID:950534 发表于 2021-7-31 09:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:808821 发表于 2021-8-1 11:23 | 只看该作者
F1的单片机是啥型号的?  只要定时器够用 就可以 ,舵机的周期是20ms  应该和电机的频率(k以上)差很多  ,不能用同一个定时器 。第一次回帖。
回复

使用道具 举报

板凳
ID:949088 发表于 2021-8-1 11:30 | 只看该作者
用一个可以固定频率固定个数的pwm波控制,最好写成函数的形式
回复

使用道具 举报

地板
ID:161164 发表于 2021-8-1 13:46 | 只看该作者
除了主循环外,不要用while
少用for
不要用delay

例:现有三个程序想把他们合起来
程序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()//八位数码管动态扫描程序
  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()//八位数码管动态扫描程序
  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. }
复制代码

这样改法,合起来时就不会互相影响

回复

使用道具 举报

5#
ID:950534 发表于 2021-8-1 20:22 | 只看该作者
lkc8210 发表于 2021-8-1 13:46
除了主循环外,不要用while
少用for
不要用delay

受教了,谢谢
回复

使用道具 举报

6#
ID:950534 发表于 2021-8-1 20:22 | 只看该作者
liurongbao 发表于 2021-8-1 11:23
F1的单片机是啥型号的?  只要定时器够用 就可以 ,舵机的周期是20ms  应该和电机的频率(k以上)差很多   ...

好的,我试试,谢谢
回复

使用道具 举报

7#
ID:950534 发表于 2021-8-1 20:22 | 只看该作者
liurongbao 发表于 2021-8-1 11:23
F1的单片机是啥型号的?  只要定时器够用 就可以 ,舵机的周期是20ms  应该和电机的频率(k以上)差很多   ...

好的,我试试,谢谢
回复

使用道具 举报

8#
ID:950534 发表于 2021-8-1 20:23 | 只看该作者
khjkhjhkj 发表于 2021-8-1 11:30
用一个可以固定频率固定个数的pwm波控制,最好写成函数的形式

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表