【AT-START-F425测评】TMR 舵机驱动
[复制链接]
【目的】为了展现CAN双信通信,需要用AT32F425做为接受方来驱动舵机工作。
【思路】在前面CH582用蓝牙控制舵机的定时器PWM来驱动舵机。驱动需要用的定时,来驱动舵机。
控制线用于传输角度控制信号。这个角度是由控制信号脉冲的持续时间决定的,这叫做脉冲编码调制(PCM)。舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围,总间隔为2ms。脉冲的宽度将决定马达转动的距离。例如:1.5毫秒的脉冲,电机将转向90度的位置(通常称为中立位置,对于180°舵机来说,就是90°位置)。如果脉冲宽度小于1.5毫秒,那么电机轴向朝向0度方向。如果脉冲宽度大于1.5毫秒,轴向就朝向180度方向。以180度舵机为例,对应的控制关系是这样的:
0.5ms————-0度;
1.0ms————45度;
1.5ms————90度;
2.0ms———–135度;
2.5ms———–180度;
我这里采用TMR1来实现,代码如下:
#include "at32f425_board.h"
#include "at32f425_clock.h"
/** @addtogroup 舵机驱动
* @{
*/
gpio_init_type gpio_init_struct = {0};
tmr_output_config_type tmr_output_struct;
crm_clocks_freq_type crm_clocks_freq_struct = {0};
uint16_t timer_period = 0;
uint16_t channel1_pulse = 0;
/**
* [url=home.php?mod=space&uid=159083]@brief[/url] main function.
* @param none
* @retval none
*/
int main(void)
{
system_clock_config();
at32_board_init();
/* get system clock */
crm_clocks_freq_get(&crm_clocks_freq_struct);
/* enable tmr1/gpioa/gpiob clock */
crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
/* timer1 output pin Configuration */
gpio_init_struct.gpio_pins = GPIO_PINS_8 ;
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init(GPIOA, &gpio_init_struct);
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE8, GPIO_MUX_2);
/* compute the value to be set in arr regiter to generate signal frequency at 17.57 khz */
timer_period = (crm_clocks_freq_struct.sclk_freq/12000) - 1;
//channel1_pulse = 219 + 799; //180
channel1_pulse = 219;//0度
tmr_base_init(TMR1, timer_period, 239);
tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);
/* channel 1, 2, 3 and 4 configuration in output mode */
tmr_output_default_para_init(&tmr_output_struct);
tmr_output_struct.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_B;
tmr_output_struct.oc_output_state = TRUE;
tmr_output_struct.oc_polarity = TMR_OUTPUT_ACTIVE_LOW;
tmr_output_struct.oc_idle_state = TRUE;
tmr_output_struct.occ_output_state = TRUE;
tmr_output_struct.occ_polarity = TMR_OUTPUT_ACTIVE_HIGH;
tmr_output_struct.occ_idle_state = FALSE;
/* channel 1 */
tmr_output_channel_config(TMR1, TMR_SELECT_CHANNEL_1, &tmr_output_struct);
tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_1, channel1_pulse);
/* output enable */
tmr_output_enable(TMR1, TRUE);
/* enable tmr1 */
tmr_counter_enable(TMR1, TRUE);
while(1)
{
delay_ms(1000);
channel1_pulse = 219;
tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_1, channel1_pulse);
delay_ms(1000);
channel1_pulse = 219 + 799; //180
tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_1, channel1_pulse);
}
}
经调试给channel1_pulse的219为零度,219+799为180度。
实验现象就是舵机从0度到180度来回反复。这里注意的是要单独给舵机供5V电。
下一步用N32G45用CAN与AT32F425来相互通信展示温湿度,按键控制舵机。
|