【RISC-V MCU CH32V103测评】- 10:改写之后的直流有刷电动机驱动程序

MianQi   2021-3-26 11:14 楼主

在这两个帖子内容的基础上:

1、第八十章、CH32V103应用教程——直流有刷电机按键控制 - https://bbs.21ic.com/icview-3088792-1-1.html

2、【RISC-V MCU CH32V103测评】- 9:电动机控制板 - https://bbs.eeworld.com.cn/thread-1159389-1-1.html

 

我在原代码的基础上,增加了两个文件:

motor_DC_brush.h

/*
 * motor_DC_brush.h
 *
 *  Created on: Mar 23, 2021
 *      Author: MQ
 */

#ifndef HARDWARE_MOTOR_MOTOR_DC_BRUSH_H_
#define HARDWARE_MOTOR_MOTOR_DC_BRUSH_H_

    static u16 pwmChannelPulse = 0;
    static u8  directionMotorCurrent = 0;
    static u8  stateMotorCurrent = 0;


/*
 * 这是源文件“motor_DC_brush.c”的头文件;
 * 声明5个函数,分别用于电动机的停止、左转、右转、加速、减速;
 * 这5个功能对应着5个按键:key_0, key_1, key_2, key_3, key_4;
 * 本程序专为一个PNP加一个NPN的推挽输出驱动电路用;
 * 本程序使用的MCU电路板为南京沁恒产CH32V103(C8T6);
 * 驱动对象为:直流有刷电动机。
* 两路PWM信号 - SetCompare1 与 SetCompare4 分别接PA8和PA11。
* PA8接 PNP(上管),PA11接NPN(下管)
*/

    void motorDCStop(void);
    void motorDCForward(void);
    void motorDCBackward(void);
    void motorDCSpeedUp(void);
    void motorDCSpeedDown(void);

#endif /* HARDWARE_MOTOR_MOTOR_DC_BRUSH_H_ */

motor_DC_brush.c

/*
 * motor_DC_brush.c
 *
 *  Created on: Mar 23, 2021
 *      Author: MQ
 */


/*
 * 这是头文件“motor_DC_brush.h”的源文件;
 * 定义5个函数,分别用于电动机的停止、左转、右转、加速、减速;
 * 这5个功能对应着5个按键:key_0, key_1, key_2, key_3, key_4;
 * 本程序专为一个PNP加一个NPN的推挽输出驱动电路用;
 * 上管(PNP)发射极接VCC(MCU),下管(NPN)发射极接GND。
 * 驱动对象为:直流有刷电动机。
 */

/*
 * 本程序使用的MCU电路板为南京沁恒产CH32V103(C8T6);
 * 本程序适用的电路板连接为:
 * key_0 --> PA2
 * key_1 --> PA3
 * key_2 --> PA4
 * key_3 --> PA5
 * key_4 --> PA6
 * PNP 基极 --> PA8
 * NPN 基极 --> PA11
 */

#include "timer.h"
#include "motor_DC_brush.h"

//电动机停车
void motorDCStop(void){
    //,。关闭PWM输出:
    TIM_CtrlPWMOutputs(TIM1, DISABLE);

    /*LED指示当前开关状态:
     *LED0 和 LED1 都灭,电动机关;
     *LED0 开,LED1 关,电动机左转;
     *LED1 开,LED0 关,电动机右转。
     */
    GPIO_SetBits(GPIOA,GPIO_Pin_0);
    GPIO_SetBits(GPIOA,GPIO_Pin_1);

    //《》两路信号均无输出:
    //TIM_SetCompare1(TIM1,0);
    //TIM_SetCompare4(TIM1,0);
    stateMotorCurrent = 0;

    Delay_Ms(200);
}

//左转
void motorDCForward(void){
    //,。开启PWM输出:
    TIM_CtrlPWMOutputs(TIM1, ENABLE);

    /*LED指示当前开关状态:
     *LED0 和 LED1 都灭,电动机关;
     *LED0 开,LED1 关,电动机左转;
     *LED1 开,LED0 关,电动机右转。
     */
    GPIO_SetBits(GPIOA,GPIO_Pin_0);
    GPIO_ResetBits(GPIOA,GPIO_Pin_1);

    //《》两路信号均无输出:
    //TIM_SetCompare1(TIM1,0);
    //TIM_SetCompare4(TIM1,0);
    //Delay_Ms(200);

    TIM_SetCompare4(TIM1,pwmChannelPulse);
    TIM_SetCompare1(TIM1,0);

    directionMotorCurrent = 0;
    printf("DIR:%d\r\n",directionMotorCurrent);
}

//右转
void motorDCBackward(void){
    //,。开启PWM输出:
    TIM_CtrlPWMOutputs(TIM1, ENABLE);

    /*LED指示当前开关状态:
     *LED0 和 LED1 都灭,电动机关;
     *LED0 开,LED1 关,电动机左转;
     *LED1 开,LED0 关,电动机右转。
     */
    GPIO_ResetBits(GPIOA,GPIO_Pin_0);
    GPIO_SetBits(GPIOA,GPIO_Pin_1);

    //《》两路信号均无输出:
    //TIM_SetCompare1(TIM1,0);
    //TIM_SetCompare4(TIM1,0);
    //Delay_Ms(10);

    TIM_SetCompare1(TIM1,pwmChannelPulse);
    TIM_SetCompare4(TIM1,0);

    directionMotorCurrent = 1;
    printf("DIR:%d\r\n",directionMotorCurrent);
}

//加速
void motorDCSpeedUp(void){
    pwmChannelPulse += 50;                  //增加占空比,提高电机转速
    pwmChannelPulse = ARR < pwmChannelPulse ? ARR : pwmChannelPulse;    // 检查占空比的合法性
}

//减速
void motorDCSpeedDown(void){
    pwmChannelPulse -= 50;                  //增加占空比,降低电机转速
    pwmChannelPulse = ARR < pwmChannelPulse ? ARR : pwmChannelPulse;    // 检查占空比的合法性
}

相应地做了修改之后的主文件:

    /********************************** (C) COPYRIGHT *******************************
    * File Name          : main.c
    * Author             : WCH
    * Version            : V1.0.0
    * Date               : 2020/09/29
    * Description        : Main program body.
    *******************************************************************************/
    #include "debug.h"
    #include "led.h"
    #include "key.h"
    #include "timer.h"
    #include "motor_DC_brush.h"

    int main(void)
    {
        u8 t=0;

        USART_Printf_Init(115200);
        Delay_Init();                         //延时函数初始化
        LED_Init();                           //LED初始化
        KEY_Init();                           //按键初始化
        TIM1_PWMOut_Init();                   //PWM输出初始化
        TIM_CtrlPWMOutputs(TIM1, DISABLE);

        printf("SystemClk:%d\r\n",SystemCoreClock);

        while(1)
        {
            t=KEY_Scan(0);      //得到键值

            switch(t)
            {
                case KEY0_PRESS:
                    motorDCStop();
                    break;

                case KEY1_PRESS:
                    if(stateMotorCurrent == 1) {
                        motorDCStop();
                        //Delay_Ms(200);
                        motorDCForward();
                    } else {
                        motorDCForward();
                    }
                    break;

                case KEY2_PRESS:
                    motorDCSpeedUp();
                    break;

                case KEY3_PRESS:
                    motorDCSpeedDown();
                    break;


                case KEY4_PRESS:
                    if(stateMotorCurrent == 0) {
                        motorDCStop();
                        //Delay_Ms(200);
                        motorDCBackward();
                    } else {
                        motorDCBackward();
                    }
                    break;

                default:
                    Delay_Ms(10);
            }
        }
    }

 

本帖最后由 MianQi 于 2021-3-26 11:14 编辑
“Everyone wants the project to be good, fast, and cheap... pick two.” - Unknown

回复评论 (10)

先用自己在面包板上搭的双BJT驱动电路,能实现启停和正转,但不能反转。后改为L298N驱动板,可以实现启停和正反转,但是还不能加减速。

在测试的过程中还发现两个问题:

1、沁恒板上的电源开关似乎不起作用。2、沁恒板上的管脚有时会出现接触不良的情况,也可能是我用的跳线插头不够紧。

 

实物照:

IMG_20210326_102309.jpg

视频:


 

 

 

“Everyone wants the project to be good, fast, and cheap... pick two.” - Unknown
点赞  2021-3-26 11:14

对MOTOR中的头文件和源文件做了一点修改,现在可以实现启停、正反转以及加减速了。

test_motor_DC_brush.zip (992.85 KB)
(下载次数: 0, 2021-3-27 08:09 上传)

“Everyone wants the project to be good, fast, and cheap... pick two.” - Unknown
点赞  2021-3-27 08:10

记得这个大的L298N最小电压是5V,你的103供电是多少伏?

点赞  2021-3-27 08:52
引用: littleshrimp 发表于 2021-3-27 08:52 记得这个大的L298N最小电压是5V,你的103供电是多少伏?

103通过PC供电。外接的12v给L298供电,L298上有一路5v输出,没有用。也就是说,电动机是12v供电——我用的是12v的高速航模电动机。

“Everyone wants the project to be good, fast, and cheap... pick two.” - Unknown
点赞  2021-3-27 09:04
引用: MianQi 发表于 2021-3-27 09:04 103通过PC供电。外接的12v给L298供电,L298上有一路5v输出,没有用。也就是说,电动机是12v供电—&m ...

我看原理图103的PC 5V输入过了一个LM1117转换为3.3V,这样103的I/O输出电平就是3.3V最大,如果L298N不支持3.3V输入,这个方面可能会有问题。

虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞 (1) 2021-3-27 11:03

这是个问题,但实测中的确是能调速。至于说影响,有待继续考察。

“Everyone wants the project to be good, fast, and cheap... pick two.” - Unknown
点赞  2021-3-27 13:03

查了一下ST L298的技术手册,里边有:

捕获.JPG

可见,3.3v的输入信号没问题。

 

“Everyone wants the project to be good, fast, and cheap... pick two.” - Unknown
点赞  2021-3-29 09:42
引用: MianQi 发表于 2021-3-29 09:42 查了一下ST L298的技术手册,里边有: 可见,3.3v的输入信号没问题。  

这个最大值是表示芯片不会损坏的电压上限,不代表这个电压可以正常工作。

虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2021-4-20 11:24

NICE!!!!!!!!!!

点赞  2024-6-25 14:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复