GD32103系列 电机驱动项目总结

本文介绍了使用GD32芯片进行电机驱动的实践经验,包括PWM配置、485通信、电机驱动原理及软硬刹车策略。通过线性递增函数实现电机的平滑启动和停止,详细讲解了电机正转、软刹车和硬刹车的实现过程,并涉及电流采集和按键、Flash读写的注意事项。
摘要由CSDN通过智能技术生成

这次使用的GD系列的芯片来做电机的驱动。然后对使用GD芯片做个总结。这次做的是一个光伏机器人项目。主要用在光伏板上的机器人,通过驱动电机来清理光伏板。

 

1.PWM配置

电机驱动使用的是PWM波来驱动。所以我们首先先用GD芯片来产生PWM波。首先下面是PWM的定时器配置。

void PWM_Timer_Config(uint32_t psr, uint32_t arr, uint32_t duty)
{
    timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;
	timer_break_parameter_struct timer_breakpara;

    rcu_periph_clock_enable(RCU_TIMER0);
		
    timer_deinit(TIMER0);

    /* TIMER0 configuration */
    timer_initpara.prescaler         = psr;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = arr;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER0,&timer_initpara);

     /* CH0 configuration in PWM mode */
    timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
    timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE;
    timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
    timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
    timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_HIGH;
    timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_HIGH;
    timer_channel_output_config(TIMER0,TIMER_CH_0,&timer_ocintpara);

    timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,duty);
    timer_channel_output_mode_config(TIMER0,TIMER_CH_0,TIMER_OC_MODE_PWM0);
    timer_channel_output_shadow_config(TIMER0,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE);
		
		
    timer_breakpara.runoffstate      = TIMER_ROS_STATE_DISABLE;
    timer_breakpara.ideloffstate     = TIMER_IOS_STATE_DISABLE ;
    timer_breakpara.deadtime         = 5;
    timer_breakpara.breakpolarity    = TIMER_BREAK_POLARITY_HIGH;
    timer_breakpara.outputautostate  = TIMER_OUTAUTO_ENABLE;
    timer_breakpara.protectmode      = TIMER_CCHP_PROT_0;
    timer_breakpara.breakstate       = TIMER_BREAK_ENABLE;
    timer_break_config(TIMER0,&timer_breakpara);
		//timer_break_enable(TIMER0);
		

    time
  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!对于GD32系列微控制器驱动步进电机,您可以使用GPIO口来控制步进电机的转动。下面给出一个简单的示例代码,以帮助您开始驱动步进电机: ```C #include "gd32f10x.h" #define MOTOR_PORT GPIOA #define MOTOR_STEP_PIN GPIO_PIN_0 #define MOTOR_DIR_PIN GPIO_PIN_1 void motor_init() { /* 使能GPIOA时钟 */ rcu_periph_clock_enable(RCU_GPIOA); /* 配置MOTOR_STEP_PIN为推挽输出 */ gpio_init(MOTOR_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, MOTOR_STEP_PIN); /* 配置MOTOR_DIR_PIN为推挽输出 */ gpio_init(MOTOR_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, MOTOR_DIR_PIN); } void motor_rotate(uint8_t direction, uint32_t steps) { /* 设置方向 */ if (direction == 1) { gpio_bit_reset(MOTOR_PORT, MOTOR_DIR_PIN); // 逆时针方向 } else { gpio_bit_set(MOTOR_PORT, MOTOR_DIR_PIN); // 顺时针方向 } /* 控制步进电机转动 */ for (uint32_t i = 0; i < steps; i++) { gpio_bit_reset(MOTOR_PORT, MOTOR_STEP_PIN); delay_us(500); // 控制脉冲宽度,可根据需要调整 gpio_bit_set(MOTOR_PORT, MOTOR_STEP_PIN); delay_us(500); // 控制脉冲周期,可根据需要调整 } } int main() { motor_init(); while (1) { motor_rotate(0, 200); // 顺时针转动200步 delay_ms(1000); // 停顿1秒 motor_rotate(1, 200); // 逆时针转动200步 delay_ms(1000); // 停顿1秒 } } ``` 上述代码通过控制GPIO口的高低电平实现驱动步进电机的转动,其中`MOTOR_PORT`为步进电机所连接的GPIO端口,`MOTOR_STEP_PIN`为步进电机的步进脉冲引脚,`MOTOR_DIR_PIN`为步进电机的方向控制引脚。`motor_rotate`函数用于控制步进电机的转动方向和步数,其中`direction`为转动方向(0表示顺时针,1表示逆时针),`steps`为转动步数。示例代码中的`main`函数实现了一个简单的循环驱动步进电机旋转的效果。 请注意,示例代码中的延时函数`delay_us`和`delay_ms`需要根据实际的系统时钟频率进行调整或替换,以确保正确的延时时间。此外,您还需要根据实际的硬件连接情况进行适当的修改。希望以上代码能对您有所帮助!如果您还有其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值