仿真图:
芯片/模块的特点:
STM32F103简介:
高性能处理器:STM32F103系列采用ARM Cortex-M3内核,工作频率可达到72MHz,具有较高的计算能力和执行效率。
多种存储容量和类型:STM32F103系列提供了不同存储容量和类型的微控制器,包括Flash存储器和RAM存储器。Flash存储器容量范围从16KB到512KB不等,RAM存储器容量从10KB到64KB不等,可以根据应用需求选择适当的存储容量。
丰富的外设接口:STM32F103系列微控制器提供了多种外设接口,包括串行通信接口(如USART、SPI、I2C等)、通用定时器和计数器、模拟数字转换器(ADC)、PWM输出、以太网接口等,可满足各种应用的需求。
低功耗特性:STM32F103系列微控制器具有多种低功耗模式,以在不同的应用场景下降低系统功耗,并延长电池寿命。例如,它支持停机模式、待机模式和休眠模式等。
强大的软件生态系统:STM32F103系列微控制器支持意法半导体公司的STM32Cube软件开发生态系统,提供了一系列工具和软件库,简化了软件开发过程,同时还有广泛的开发社区支持。
安全性功能:STM32F103系列微控制器具有硬件加密和校验功能,可确保代码的安全性和完整性。
丰富的包装选项:STM32F103系列提供多种封装选项,包括LQFP、BGA、LFBGA等,方便了不同应用和布局要求的设计。
L9110特点:
双路驱动:L9110可以同时驱动两个直流电机,每个驱动通道最大电流可达800mA。这使得它非常适用于需要控制多个电机的应用。
低电压工作:L9110可以在较低的电源电压下工作,通常在2.5V至12V之间。这使得它适用于电池供电的低电压应用,如机器人、小型车辆等。
高效能:该芯片采用了双H桥驱动技术,具有较高的效率和较低的功耗。它可以提供高达15kHz的PWM(脉冲宽度调制)频率,以实现电机速度的精确控制。
内置保护功能:L9110具有过温保护和短路保护功能,可有效保护芯片和电机免受过载和短路等异常情况的损害。
引脚简单:L9110只需要几个引脚就可以实现电机的驱动,包括两个输入引脚控制电机的正反转,以及两个输出引脚连接电机。
主程序:
#include "gpio.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include "timer.h"
#include "key.h"
unsigned char pwmRigh = 30; // pwm调整
unsigned char djs = 200;
char dis0[16]; // 暂存
char dis1[16]; // 暂存
unsigned char rekey = 0; // 按键防止抖动
unsigned char contNum = 0; // 循环计数
unsigned char motorFlag = 0;
unsigned char motorDir = 1;
int main(void)
{
delay_init(); // 延时函数初始化
// uart_init(9600); // 串口初始化为9600
// uart2_init(9600) ;
TIM3_Int_Init(9, 7199); // 2ms
GPIO_LED_MOTOR_Init(); // 初始化与LED连接的硬件接口
KEY_Init();
MOTOR_INA = 1;
MOTOR_INB = 1;
LED_START = 1;
LED_STOP = 0;
LED_F = 0;
LED_R = 1;
pwmRigh = 30; // pwm调整
delay_ms(100);
while (1)
{
if ((KEY_START == 0) || (KEY_STOP == 0) || (KEY_F == 0) || (KEY_R == 0) || (KEY_ADD == 0) || (KEY_SUB == 0)) // 检测到按键按下
{
delay_ms(10); // 小抖动
if (rekey == 0)
{
if (KEY_START == 0) //启动键
{
LED_START = 0;
LED_STOP = 1;
rekey = 1;
motorFlag = 1;
}
else if (KEY_STOP == 0) //停止键
{
LED_START = 1;
LED_STOP = 0;
rekey = 1;
motorFlag = 0;
}
else if (KEY_F == 0) //正转键
{
LED_F = 0;
LED_R = 1;
rekey = 1;
motorDir = 1;
MOTOR_INA = 1;
MOTOR_INB = 1;
}
else if (KEY_R == 0) //反转键
{
LED_F = 1;
LED_R = 0;
rekey = 1;
motorDir = 0;
MOTOR_INA = 1;
MOTOR_INB = 1;
}
else if (KEY_ADD == 0) //加速键
{
rekey = 1;
if (pwmRigh < 50)
pwmRigh = pwmRigh + 5; // pwm 调速
}
else if (KEY_SUB == 0) //减速键
{
rekey = 1;
if (pwmRigh > 30)
pwmRigh = pwmRigh - 5; // pwm 调速
}
}
}
else
{
rekey = 0; // 防止重复检测到按键
}
delay_ms(100);
}
}
void pwmCtrl(void)
{
static unsigned char countRigh;
if (motorFlag == 1)
{
countRigh++;
if (motorDir == 0)
{
if (countRigh < pwmRigh) // 占空比调节
{
MOTOR_INA = 0;
}
else if (countRigh <= 50) // 关闭时间段
{
MOTOR_INA = 1;
if (countRigh == 50)
countRigh = 0;
}
}
else
{
if (countRigh < pwmRigh) // 占空比调节
{
MOTOR_INB = 0;
}
else if (countRigh <= 50) // 关闭时间段
{
MOTOR_INB = 1;
if (countRigh == 50)
countRigh = 0;
}
}
}
else
{
MOTOR_INA = 1;
MOTOR_INB = 1;
}
}
设计文件: