微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求伺服电机的控制程序

求伺服电机的控制程序

时间:10-02 整理:3721RD 点击:
各位大哥,谁有控制伺服电机的程序,stm32f4的,小弟想学习一下,最好有加减速和编码器的,谢谢大哥们

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;
}

跟着小编学习一下              

谢谢大哥,不过我要的是stmf4的,不是51

道理都是一样的 就是IO配置区别

控制伺服电机的程序
比如说数控里面,加工程序就可以控制伺服电机,是不是这样的理解呢

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;
}

同问,一起学习STM32F4的程序

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top