求伺服电机的控制程序

2019-07-15 11:44发布

各位大哥,谁有控制伺服电机的程序,STM32f4的,小弟想学习一下,最好有加减速和编码器的,谢谢大哥们
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
as493428735
2019-07-16 10:43
51单片机除了几款加强版的带pwm,很多都不带,所以要用51控制伺服电机很多时候就要软件模拟pwm。看了些代码有的是通过延时来输出pwm波,有的也用了定时器但是那些代码要驱动多路伺服电路就显得比较麻烦。下面的代码是通过定时器0产生每0.5ms一次的提醒,程序在大循环中通过调用DJ()函数可以返还值给伺服电机信号引脚,DJ()函数可以定旋转的角度,但是因为定时器设置是0.5ms的中断这就决定了旋转呢角度只能是-45,-90,0,45,90。如果要提高精度就要通过设置定时器的初值,改变函数的num值来达成。
#include"reg52.h"
unsigned int num=0;
//舵机
sbit DJ1=P3^6;
sbit DJ2=P3^7;          /*引脚定义*/
int DJ(int a);             //函数声明
timerinit()            //定时器中断初始化
{
TMOD=0x01;                               //设置定时器0为工作方式1
EA=1;                                    //开总中断
ET0=1;                                   //定时器0中断允许
    TH0 = (65536-500)/256;                  //初值使得定时器0.5毫秒溢出
    TL0 = (65536-500)%256;
TR0=0;         
}
main()
{
timerinit();
while(1)
  {
    }
}
timer()  interrupt 0       //0.5ms发生一次中断,20ms后定时器置0重新计数
{
  num++;
  DJ1=DJ(3);
  DJ2=DJ(3);
  if(num>=40)     
  {
   num=0;
      TH0 = (65536-500)/256;                  //初值使得定时器0.5毫秒溢出
    TL0 = (65536-500)%256;
   return;
  }
}
int DJ(char a)           //当a=3舵机所在的位置是0度a=2 a=1分别对应的位置是-45 -90度a=4 a=5对应位置为45 90度
{
if(num>=a||num>=5)
  return 0;
if(num>=1)
  return 1;
}

一周热门 更多>