*******************************************************************************
* 程序名称:9g舵机控制
* 硬件说明:VCC-----------------4-6V
* GND---------------- GND
* PWM----------------IO口
*软件说明: 舵机的转动需要时间的,因此,程序中值的变化不能太快,不然舵机跟不上程序。
* 该舵机属于模拟舵机(非数字),锁定某一角度需要持续给PWM信号
*
*编写时间:2020.07.12
*
*特别说明:在工作精度高和快速系统中,该舵机转向速度跟不上
******************************************************************************/
#include <msp430.h>
#define SERVO TA2CCR2 //P2.5
void servo_angle(int angle)
{
//对应计数时钟为32768 Hz
if(angle>90) angle=90; //输入限幅
if(angle<(-90)) angle=(-90);
SERVO =(int) (49.152+angle*0.364); //(49为舵机0度基数)
//SERVO = 82; //90
//SERVO = 49; //0
//SERVO = 16; //-90
}
/***舵机PWM输出初始化***/
void servo_init()
{
//对应计数时钟为32768 Hz
P2DIR |= BIT5;
P2SEL |= BIT5 ;//PWM输出
TA2CCR0 =655; //PWM周期长度 必须20ms(50Hz)时钟不同,值不同
TA2CCTL2 = OUTMOD_7;
TA2CTL = TASSEL__ACLK + MC_1 +TACLR;
}
//void servo_angle(int angle)
//{
// //计数时钟为1.048756 MHz 时
// if(angle>90) angle=90; //输入限幅
// if(angle<-90) angle=-90;
// SERVO =(int)(1573.134+angle*11.654);//( 计数值1573= 1048756*1.5ms)
//}
//
///***舵机PWM输出初始化***/
//void servo_init()
//{
// //计数时钟为1.048756 MHz 时
// P2DIR |= BIT5;
// P2SEL |= BIT5 ;//PWM输出
// TA2CCR0 =20975;//PWM周期长度 必须20ms 1.048756/50 Hz
// TA2CCTL2 = OUTMOD_7;
// TA2CTL = TASSEL__SMCLK + MC_1 +TACLR;
//}
//扇形扫描
int i=0,a=0;
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
servo_init();
servo_angle(0);
_delay_cycles(5000000);
while(1)
{
if(a)
{
i-=2;
servo_angle(i);
_delay_cycles(20000);
}
else
{
i+=2;
servo_angle(i);
_delay_cycles(20000);
}
if( i==90 || i==-90 ) a=!a;
}
}
|