TB67H450FNG\TB67H451FNG\DRV8870\DRV8871\DRV8872等 PWM调速

要结合电路设计对电机控制,控制有4种情况:正转、反转、制动、停止;

正转:CHx 输出PWM 时,CHxN输出低电平;

反转:CHxN 输出PWM 时,CHx输出低电平;

制动:CHxN 和CHx输出高电平;

停止:CHxN 和CHx输出低电平;

代码用到 RT-Thread 部分函数,使用 rt_pwm_disable 禁用CHxN或CHx时都是输出高电平,网上很多使用下面几个函数实现:

TIM_Cmd(TIM3 ,DISABLE);//关闭PWM输出

TIM_ForcedOC1Config(TIM3, TIM_ForcedAction_InActive);//将PWM输出强制为低

TIM_SelectOCxM(TIM3, TIM_Channel_1, TIM_OCMode_PWM1);

TIM_CCxCmd(TIM3, TIM_Channel_1, TIM_CCx_Enable);

TIM_Cmd(GENERAL_TIM, ENABLE);//使能TIMER3,开始产生PWM

但是没法达到目的,主要是比较寄存器和计数寄存器是共用的;

经过测试对比后,直接采用设置引脚功能的方式,代码简单延时少,下面是代码:

typedef enum{
    _e_up_down_motor_stop = 0,                     //!< _e_up_down_motor_stop
    _e_up_down_motor_forward, //Forward 前进
    _e_up_down_motor_reverse, //Reverse 倒车
    _e_up_down_motor_up=_e_up_down_motor_forward,  //!< _e_up_down_motor_up
    _e_up_down_motor_down=_e_up_down_motor_reverse,//!< _e_up_down_motor_down
    _e_up_down_motor_brake //Brake 制动
} MOTOR_UP_DOWN_CTRL;//


/**
 *升降电机
 * @param channel 0~3
 * @param ud
 * @return
 */
int rc1000::up_dowm_ctrl( rt_uint8_t channel, MOTOR_UP_DOWN_CTRL ud )
{
    /** TB67H450FNG\TB67H451FNG\DRV8870\DRV8871\DRV8872
     * IN1      IN2   OUT1         OUT2           Mod
     *  L       L     OFF (Hi-Z)   OFF (Hi-Z)     Stop, Standby mode after 1 ms
     *  H       L     H            L              Forward
     *  L       H     L            H              Reverse
     *  H       H     L            L              Brake
     **/

    const int i=0;
    MOTOR_CTRL_UP_DOWN_CONF *motor = &motor_ctrl_up_down_config[ channel ];

    auto _set_pin=[]( uint32_t Pin ) {
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        GPIO_InitStruct.Pin = Pin;// GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;//GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
    };

    rt_pin_mode( motor->up, PIN_MODE_OUTPUT_OD );
    rt_pin_mode( motor->dowm, PIN_MODE_OUTPUT_OD );

    if(ud==_e_up_down_motor_up) { //Forward 前进
        rt_pin_write( motor->up, PIN_LOW );
        rt_pin_write( motor->dowm, PIN_LOW );

        _set_pin( 0x01 <<( motor->dowm - GET_PIN(E, 0) ) );

    } else if(ud==_e_up_down_motor_down){ //Reverse 倒车
        rt_pin_write( motor->up, PIN_LOW );
        rt_pin_write( motor->dowm, PIN_LOW );

        _set_pin( 0x01 <<( motor->up - GET_PIN(E, 0) ) );
    }else if(ud==_e_up_down_motor_brake){ //Brake 制动
        rt_pin_write( motor->up, PIN_HIGH );
        rt_pin_write( motor->dowm, PIN_HIGH );
    } else { //Stop, Standby 停止
        rt_pin_write( motor->up, PIN_LOW );
        rt_pin_write( motor->dowm, PIN_LOW );
    }

    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值