//几年前曾发过一个关于舵机的驱动程序 貌似看的人很多
//为了更好的和大家交流 我把最近在AVR ATmega128上写的舵机驱动程序晒晒 请大家多多指教
/*==============================================================================
功能:舵机驱动程序
注意事项:
提示说明:PE3-OC3A PE4-OC3B PE5-OC3C
OC3A: 50Hz OC3B: OC3C:
==============================================================================*/
#include <iom128.h>
#include <ina90.h>
/***************************************************************************
* 函数功能:Timer3_init函数*
* 入口参数:
* 出口参数:
***************************************************************************/
void Timer3_init(void)
{
PORTE |=0x38;//PE3-5 out
DDRE |=0x38;
//T3
TCCR3A |= 0xa8; //A B C 都是相位修正及相频修正PWM模式 升序记数时比较匹配将清零
TCCR3B |= 0x13; //N=64分频
TCCR3C=0x00;
ICR3=1152; //f=fclk/(2*N*TOP)=50Hz(20ms),TOP=ICR1,fclk=7.3728M.
TCNT3=0x0000;
OCR3A=0x0000;
OCR3B=0x0000;
OCR3C=0x0000;
}
/***************************************************************************
* 函数功能:PWM_change函数*
* 入口参数:OCR3x,舵机ID;value 角度值,0-180/10 步长为10度
* 提示说明:value值的bit6-7都为1,作为命令标识
***************************************************************************/
void PWM3_change(unsigned int OCR3x,unsigned char value)
{
//if((value & 0xc0)==0xc0)//判断是否是舵机控制命令
//{
//value=(value-0xc0)*10;
switch(OCR3x)
{
case 0x01:OCR3A=value*58/90+29;//修改A舵机角度值
break;
case 0x02:OCR3B=value*58/90+29;//修改B舵机角度值
break;
case 0x03:OCR3C=value*58/90+29;//修改C舵机角度值
break;
case 0x04:OCR3A=value*58/90+29;//修改A和B舵机角度值
OCR3B=value*58/90+29;
break;
case 0x05:OCR3A=value*58/90+29;//修改A B和C舵机角度值
OCR3B=value*58/90+29;
OCR3C=value*58/90+29;
break;
default: break;
}
//}
}
评论