|
*******************************************************************************
* 程序名稱:9g舵機(jī)控制
* 硬件說明:VCC-----------------4-6V
* GND---------------- GND
* PWM----------------IO口
*軟件說明: 舵機(jī)的轉(zhuǎn)動(dòng)需要時(shí)間的,因此,程序中值的變化不能太快,不然舵機(jī)跟不上程序。
* 該舵機(jī)屬于模擬舵機(jī)(非數(shù)字),鎖定某一角度需要持續(xù)給PWM信號(hào)
*
*編寫時(shí)間:2020.07.12
*
*特別說明:在工作精度高和快速系統(tǒng)中,該舵機(jī)轉(zhuǎn)向速度跟不上
******************************************************************************/
#include <msp430.h>
#define SERVO TA2CCR2 //P2.5
void servo_angle(int angle)
{
//對(duì)應(yīng)計(jì)數(shù)時(shí)鐘為32768 Hz
if(angle>90) angle=90; //輸入限幅
if(angle<(-90)) angle=(-90);
SERVO =(int) (49.152+angle*0.364); //(49為舵機(jī)0度基數(shù))
//SERVO = 82; //90
//SERVO = 49; //0
//SERVO = 16; //-90
}
/***舵機(jī)PWM輸出初始化***/
void servo_init()
{
//對(duì)應(yīng)計(jì)數(shù)時(shí)鐘為32768 Hz
P2DIR |= BIT5;
P2SEL |= BIT5 ;//PWM輸出
TA2CCR0 =655; //PWM周期長(zhǎng)度 必須20ms(50Hz)時(shí)鐘不同,值不同
TA2CCTL2 = OUTMOD_7;
TA2CTL = TASSEL__ACLK + MC_1 +TACLR;
}
//void servo_angle(int angle)
//{
// //計(jì)數(shù)時(shí)鐘為1.048756 MHz 時(shí)
// if(angle>90) angle=90; //輸入限幅
// if(angle<-90) angle=-90;
// SERVO =(int)(1573.134+angle*11.654);//( 計(jì)數(shù)值1573= 1048756*1.5ms)
//}
//
///***舵機(jī)PWM輸出初始化***/
//void servo_init()
//{
// //計(jì)數(shù)時(shí)鐘為1.048756 MHz 時(shí)
// P2DIR |= BIT5;
// P2SEL |= BIT5 ;//PWM輸出
// TA2CCR0 =20975;//PWM周期長(zhǎng)度 必須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;
}
}
|
|