2555|2

6960

帖子

11

TA的资源

版主

楼主
 

【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来相互通信展示温湿度,按键控制舵机。



 

最新回复

从0度到180度来回反复的波形能看出来 楼主的示波器不错   详情 回复 发表于 2022-4-1 18:11
点赞(1) 关注
 
 

回复
举报

6802

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

从0度到180度来回反复的波形能看出来

楼主的示波器不错

点评

五年前2000多买的吧,大多在吃灰,如果在用于定时器之类的调试,示波器相比逻辑分析仪就效率成倍增长。  详情 回复 发表于 2022-4-1 18:46
 
 
 

回复

6960

帖子

11

TA的资源

版主

板凳
 
Jacktang 发表于 2022-4-1 18:11 从0度到180度来回反复的波形能看出来 楼主的示波器不错

五年前2000多买的吧,大多在吃灰,如果在用于定时器之类的调试,示波器相比逻辑分析仪就效率成倍增长。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表