求伺服电机的控制程序

2019-07-15 11:44发布

各位大哥,谁有控制伺服电机的程序,STM32f4的,小弟想学习一下,最好有加减速和编码器的,谢谢大哥们
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
hobbye501
1楼-- · 2019-07-15 16:53
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;
} 最佳答案
李春明
2楼-- · 2019-07-15 21:49
跟着楼主学习一下              
卡萨哈法
3楼-- · 2019-07-15 23:12
 精彩回答 2  元偷偷看……
hobbye501
4楼-- · 2019-07-16 02:57
卡萨哈法 发表于 2017-3-11 19:56
谢谢大哥,不过我要的是stmf4的,不是51

道理都是一样的 就是IO配置区别
as493428735
5楼-- · 2019-07-16 06:16
控制伺服电机的程序
比如说数控里面,加工程序就可以控制伺服电机,是不是这样的理解呢
as493428735
6楼-- · 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;
}

一周热门 更多>