在这两个帖子内容的基础上:
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 编辑
汇总:
【RISC-V MCU CH32V103测评】- 0:初次见面的三个没有想到
【RISC-V MCU CH32V103测评】- 1:从 pdf 到 Studio
【RISC-V MCU CH32V103测评】- 2:让 LED 闪起来这事其实并不简单
【RISC-V MCU CH32V103测评】- 3:USART - 为什么试了三个串口工具都不行?
【RISC-V MCU CH32V103测评】- 4:EXTI 开启查错之旅
【RISC-V MCU CH32V103测评】- 5:离开API进入Assembly不成,重返API......
【RISC-V MCU CH32V103测评】- 6:SD卡(SPI)
【RISC-V MCU CH32V103测评】- 7:PWM 也不简单
【RISC-V MCU CH32V103测评】- 8:COMTransmit - 串口调试工具
先用自己在面包板上搭的双BJT驱动电路,能实现启停和正转,但不能反转。后改为L298N驱动板,可以实现启停和正反转,但是还不能加减速。
在测试的过程中还发现两个问题:
1、沁恒板上的电源开关似乎不起作用。2、沁恒板上的管脚有时会出现接触不良的情况,也可能是我用的跳线插头不够紧。
实物照:
视频:
对MOTOR中的头文件和源文件做了一点修改,现在可以实现启停、正反转以及加减速了。
记得这个大的L298N最小电压是5V,你的103供电是多少伏?
引用: littleshrimp 发表于 2021-3-27 08:52 记得这个大的L298N最小电压是5V,你的103供电是多少伏?
103通过PC供电。外接的12v给L298供电,L298上有一路5v输出,没有用。也就是说,电动机是12v供电——我用的是12v的高速航模电动机。
引用: 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输入,这个方面可能会有问题。
引用: MianQi 发表于 2021-3-29 09:42 查了一下ST L298的技术手册,里边有: 可见,3.3v的输入信号没问题。
这个最大值是表示芯片不会损坏的电压上限,不代表这个电压可以正常工作。