简介
舵机:它由直流电机、减速齿轮组、传感器和控制电路组成的一套自动控制系统。舵机已经广泛应用于模型玩具、无人机、机器人、智能家居和工业自动化等领域。它们的尺寸虽然小,但是能够输出很大的力。
部分代码展现
/* TIMERA unit and clock definition */
#define TIMERA_UNIT1 (M4_TMRA3)
#define TIMERA_UNIT1_CLOCK (PWC_FCG2_PERIPH_TIMA3)
#define TIMERA_UNIT1_OVERFLOW_INT (INT_TMRA3_OVF)
/* TIMERA channel 1 Port/Pin definition */
#define TIMERA_UNIT1_CH1 (TimeraCh1)
#define TIMERA_UNIT1_CH1_PORT (PortC)
#define TIMERA_UNIT1_CH1_PIN (Pin06)
#define TIMERA_UNIT1_CH1_FUNC (Func_Tima0)
void set_duty_cycle(uint16_t duty)
{
if(duty == 0)
{
TIMERA_SpecifyOutputSta(TIMERA_UNIT1, TIMERA_UNIT1_CH1, TimeraSpecifyOutputLow);
TIMERA_Cmd(TIMERA_UNIT1,Enable);
}
else if(duty >= TIMERA_COUNT_OVERFLOW)
{
TIMERA_SpecifyOutputSta(TIMERA_UNIT1, TIMERA_UNIT1_CH1, TimeraSpecifyOutputHigh);
TIMERA_Cmd(TIMERA_UNIT1,Enable);
}
else
{
stc_timera_compare_init_t stcTimerCompareInit;
MEM_ZERO_STRUCT(stcTimerCompareInit);
/* Configuration timera unit 1 compare structure */
stcTimerCompareInit.u16CompareVal = duty; //500
stcTimerCompareInit.enStartCountOutput = TimeraCountStartOutputHigh;
stcTimerCompareInit.enStopCountOutput = TimeraCountStopOutputHigh;
stcTimerCompareInit.enCompareMatchOutput = TimeraCompareMatchOutputReverse;
stcTimerCompareInit.enPeriodMatchOutput = TimeraPeriodMatchOutputHigh;
stcTimerCompareInit.enSpecifyOutput = TimeraSpecifyOutputInvalid;
stcTimerCompareInit.enCacheEn = Disable;
stcTimerCompareInit.enTriangularTroughTransEn = Disable;
stcTimerCompareInit.enTriangularCrestTransEn = Disable;
stcTimerCompareInit.u16CompareCacheVal = stcTimerCompareInit.u16CompareVal;
/* Configure Channel 1 */
TIMERA_CompareInit(TIMERA_UNIT1, TIMERA_UNIT1_CH1, &stcTimerCompareInit);
TIMERA_CompareCmd(TIMERA_UNIT1, TIMERA_UNIT1_CH1, Enable);
TIMERA_Cmd(TIMERA_UNIT1,Enable);
}
}
void set_steering_gear_dutyfactor(uint16_t dutyfactor)
{
/* 对超过范围的占空比进行边界处理 */
dutyfactor = 0.5/20.0*TIMERA_COUNT_OVERFLOW > dutyfactor ? 0.5/20.0*TIMERA_COUNT_OVERFLOW : dutyfactor;
dutyfactor = 2.5/20.0*TIMERA_COUNT_OVERFLOW < dutyfactor ? 2.5/20.0*TIMERA_COUNT_OVERFLOW : dutyfactor;
set_duty_cycle(dutyfactor);
}
void set_steering_gear_angle(uint16_t angle_temp)
{
angle_temp = (0.5 + angle_temp / 180.0 * (2.5 - 0.5)) / 20.0 * TIMERA_COUNT_OVERFLOW; // 计算角度对应的占空比
set_steering_gear_dutyfactor(angle_temp); // 设置占空比
}