MianQi 发表于 2021-3-26 11:14

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

本帖最后由 MianQi 于 2021-3-26 11:14 编辑

<p>在这两个帖子内容的基础上:</p>

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

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

<p>&nbsp;</p>

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

<p>motor_DC_brush.h</p>

<pre>
<code>/*
* 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 u8directionMotorCurrent = 0;
    static u8stateMotorCurrent = 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_ */</code></pre>

<p>motor_DC_brush.c</p>

<pre>
<code>/*
* 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 --&gt; PA2
* key_1 --&gt; PA3
* key_2 --&gt; PA4
* key_3 --&gt; PA5
* key_4 --&gt; PA6
* PNP 基极 --&gt; PA8
* NPN 基极 --&gt; 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 &lt; pwmChannelPulse ? ARR : pwmChannelPulse;    // 检查占空比的合法性
}

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

<p>相应地做了修改之后的主文件:</p>

<pre>
<code>    /********************************** (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);
            }
      }
    }</code></pre>

<p>&nbsp;</p>

okhxyyo 发表于 2021-8-17 15:42

<p><span style="font-size:16px;">汇总:</span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1155381-1-1.html" target="_blank" title="【RISC-V MCU CH32V103测评】- 0:初次见面的三个没有想到">【RISC-V MCU CH32V103测评】- 0:初次见面的三个没有想到</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1155435-1-1.html" target="_blank" title="【RISC-V MCU CH32V103测评】- 1:从 pdf 到 Studio">【RISC-V MCU CH32V103测评】- 1:从 pdf 到 Studio</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1155847-1-1.html" target="_blank" title="【RISC-V MCU CH32V103测评】- 2:让 LED 闪起来这事其实并不简单">【RISC-V MCU CH32V103测评】- 2:让 LED 闪起来这事其实并不简单</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1156176-1-1.html" target="_blank" title="【RISC-V MCU CH32V103测评】- 3:USART - 为什么试了三个串口工具都不行?">【RISC-V MCU CH32V103测评】- 3:USART - 为什么试了三个串口工具都不行?</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1156801-1-1.html" target="_blank" title="【RISC-V MCU CH32V103测评】- 4:EXTI 开启查错之旅">【RISC-V MCU CH32V103测评】- 4:EXTI 开启查错之旅</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1156804-1-1.html" target="_blank" title="【RISC-V MCU CH32V103测评】- 5:离开API进入Assembly不成,重返API......">【RISC-V MCU CH32V103测评】- 5:离开API进入Assembly不成,重返API......</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1157197-1-1.html" target="_blank" title="【RISC-V MCU CH32V103测评】- 6:SD卡(SPI)">【RISC-V MCU CH32V103测评】- 6:SD卡(SPI)</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1158370-1-1.html" target="_blank" title="【RISC-V MCU CH32V103测评】- 7:PWM 也不简单">【RISC-V MCU CH32V103测评】- 7:PWM 也不简单</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1158396-1-1.html" target="_blank" title="【RISC-V MCU CH32V103测评】- 8:COMTransmit - 串口调试工具">【RISC-V MCU CH32V103测评】- 8:COMTransmit - 串口调试工具</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1159389-1-1.html" target="_blank" title="【RISC-V MCU CH32V103测评】- 9:电动机控制板">【RISC-V MCU CH32V103测评】- 9:电动机控制板</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1160240-1-1.html" target="_blank" title="【RISC-V MCU CH32V103测评】- 10:改写之后的直流有刷电动机驱动程序">【RISC-V MCU CH32V103测评】- 10:改写之后的直流有刷电动机驱动程序</a></span></p>

MianQi 发表于 2021-3-26 11:14

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

<p>在测试的过程中还发现两个问题:</p>

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

<p>&nbsp;</p>

<p>实物照:</p>

<p></p>

<p>视频:</p>

<p><iframe allowfullscreen="true" frameborder="0" height="450" src="http://player.youku.com/embed/XNTEyNzU5ODE1Mg" style="background:#eee;margin-bottom:10px;" width="750"></iframe><br />
&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

MianQi 发表于 2021-3-27 08:10

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

<p></p>

littleshrimp 发表于 2021-3-27 08:52

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

MianQi 发表于 2021-3-27 09:04

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

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

littleshrimp 发表于 2021-3-27 11:03

MianQi 发表于 2021-3-27 09:04
103通过PC供电。外接的12v给L298供电,L298上有一路5v输出,没有用。也就是说,电动机是12v供电&mdash;&m ...

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

MianQi 发表于 2021-3-27 13:03

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

MianQi 发表于 2021-3-29 09:42

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

<p></p>

<p>可见,3.3v的输入信号没问题。</p>

<p>&nbsp;</p>

littleshrimp 发表于 2021-4-20 11:24

MianQi 发表于 2021-3-29 09:42
查了一下ST L298的技术手册,里边有:



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

&nbsp;

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

szhying 发表于 2024-6-25 14:13

<p>NICE!!!!!!!!!!</p>
页: [1]
查看完整版本: 【RISC-V MCU CH32V103测评】- 10:改写之后的直流有刷电动机驱动程序