1.直流电机在仿真中的名称及其驱动电路
(直流电机:MOTOR 电机驱动:L298)
2.接线图及其介绍
L298学过的应该都不陌生,一个双驱电机驱动IN1和IN2与ENA一起控制一个输出,IN2和IN1是方向引脚,ENA是速度控制引脚,通过引脚PWM的占空比来实现速度的控制。
-
当IN1为低电平(0)且IN2为高电平(1)时,电机1会以一种方向旋转。
-
当IN1为高电平(1)且IN2为低电平(0)时,电机1会以相反的方向旋转。
-
当IN1和IN2同时为低电平(0)或同时为高电平(1)时,电机1会停止旋转或进入自由旋转状态。
(IN3,IN4和ENB和上述的使用是一样的,就不过多赘述了)
3.整体的原理图
在主控方面我选择了STM32F103R6,其次就是电机驱动模块,按键和OLED了
(原理图应该很详细了)
4.cubemx的配置
1)按键引脚(输出,上拉模式)
2)OLED引脚
3)电驱的方向引脚和PWM引脚
周期计算公式为=主频/(PSC+1)/(ARR+1)
占空比=(CCR+1)/(ARR+1)(CCR即Pulse)
5.代码的实现
1)电机控制模块
//mode:模式选择 0正转 1 反转
//speed:速度的设定,最低为0 最高为1000
void motor_countrol(int mode,int speed)
{
if(mode==0)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,1);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,0);
TIM3->CCR1=1000-speed;
}
if(mode==1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,0);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,1);
TIM3->CCR1=1000-speed;
}
}
2)按键控制模块
uint8_t KEY_Scan(void)
{
if(key0==0)
{
delay_ms(10);
while(key0==0);
delay_ms(10);
return 0;
}
else if(key1==0)
{
delay_ms(10);
while(key1==0);
delay_ms(10);
return 1;
}
else if(key2==0)
{
delay_ms(10);
while(key2==0)
delay_ms(10);
return 2;
}
else
return 20;
}
uint8_t mode=0;
int speed=500;
void key_motor(void)
{
uint16_t key;
key=KEY_Scan();
if(key==0)
{
speed+=100;
if(speed>=1000)
speed=1000;
}
if(key==1)
{
speed-=100;
if(speed<=0)
speed=0;
}
if(key==2)
{
mode=!mode;
}
}
6.部分功能
TIM2定时器用不了,我也不太理解,所以我是采用的定时器3