驱动电机
L298N电机驱动
PWM四种模式
采用L298N为电机驱动芯片
可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载
该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机,并联时可以驱动四台电机
由图L298N芯片的原理图,引脚A,B可用于输入PWM脉宽调制信号对电机进行调速控制。如果无须调速可将两引脚接5V,使电机工作在最高速状态,既将短接帽短接。假设驱动的两台直流电机分别为M1和M2,当输入信号端IN1接高电平输入端IN2接低电平时,电机M1正转。当信号端IN1接低电平,IN2接高电平,电机M1反转。控制另一台电机是同样的方式,输入信号端IN3接高电平,输入端IN4接低电平,电机M2正转(反之则反转)。PWM信号端A控制M1调速,PWM信号端B控制M2调速 。可通过单片机IO口状态来控制小车运行,电机具体运行方式如图
EnA控制1和2,ENB控制3和4
mos双驱动板
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200922092518455.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l1bmRk
dW4=,size_16,color_FFFFFF,t_70#pic_center)
dianji.h文件
#ifndef __dianji_H
#define __dianji_H
#include "sys.h"
#include <stm32f10x.h>
#define HIGH_SPEED 1
#define LOW_SPEED 0
#define Moter1_CH3_Value TIM2->CCR3
#define Moter1_CH4_Value TIM2->CCR4
#define Moter2_CH3_Value TIM1->CCR1
#define Moter2_CH4_Value TIM1->CCR4
void MOTOR1_PWM_Init(u16 arr,u16 psc);
void MOTOR2_PWM_Init(u16 arr,u16 psc);
void Motor_Forward(u8 speed);
void Motor_Left1(u16 value);
void Motor_Right1(u16 value);
void Motor_Left2(u16 value);
void Motor_Right2(u16 value);
void Motor_Back(void);
void Motor_Stop(void);
#endif
dianji.c文件
void MOTOR1_PWM_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0; //TIM2时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFF00FF; // pa2=tim2 ch3 pa3=tim2 ch4
GPIOA->CRL|=0X0000BB00; //复用功能推晚输出
RCC->APB2ENR|=1<<0; //开启辅助时钟
AFIO->MAPR&=0XFFFFFCFF; //清除MAPR的[9:8] // pa2 - ch3 pa3-ch4
//AFIO->MAPR|=1<<9; //部分重映像
TIM2->ARR=arr; //设定计数器自动重装值
TIM2->PSC=psc; //预分频器不分频
TIM2->CR1=0x0080; //ARPE使能
TIM2->CCMR2|=7<<12; //CH2 PWM2模式
TIM2->CCMR2|=1<<11; //CH2预装载使能
// TIM2->CCER|=1<<12; //OC4 输出使能
TIM2->CCMR2|=7<<4; //CH3 PWM2模式
TIM2->CCMR2|=1<<3; //CH3预装载使能
//TIM2->CCER|=1<<8; //OC3 输出使能
TIM2->CR1|=0x01; //使能 定时器3 定时器2
}
void MOTOR2_PWM_Init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<11; //TIM1时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRH&=0XFFFF0FF0; //PB0、PB1输出 PA8 PA11
GPIOA->CRH|=0X0000B00B; //复用功能输出 复用功能开漏输出模式
RCC->APB2ENR|=1<<0; //开启辅助时钟
AFIO->MAPR&=0XFFFFFF3F; //清除MAPR的[7:6] CH4/PA11,CH1/PA8
//AFIO->MAPR|=1<<11; //部分重映像
TIM1->BDTR|=1<<15;
TIM1->ARR=arr; //设定计数器自动重装值
TIM1->PSC=psc; //预分频器不分频
TIM1->CR1=0x0080; //ARPE使能
TIM1->CCMR2|=7<<12; //CH4 PWM2模式
TIM1->CCMR2|=1<<11; //CH4预装载使能
TIM1->CCMR1|=7<<4; //CH3 PWM2模式
TIM1->CCMR1|=1<<3; //CH3预装载使能
TIM1->CR1|=0x01; //使能定时器1
}
void Motor_Stop(void)
{
TIM1->CCER|=1<<0; //OC3 输出使能
TIM1->CCER|=1<<12; //OC4 输出使能
TIM2->CCER|=1<<8; //OC3 输出使能
TIM2->CCER|=1<<12; //OC4 输出使能
Moter1_CH3_Value=0;
Moter2_CH3_Value=0;
Moter1_CH4_Value=0; //输出全为低电平
Moter2_CH4_Value=0;
delay_ms(500);
TIM1->CCER&=~(1<<0); //OC3 输出禁止
TIM1->CCER&=~(1<<12); //OC4 输出禁止
TIM2->CCER&=~(1<<8); //OC3 输出禁止
TIM2->CCER&=~(1<<12); //OC4 输出禁止
}
void Motor_Forward(u8 speed)
{
TIM2->CCER&=~(1<<12); //OC4 输出禁止
TIM1->CCER&=~(1<<12); //OC4 输出禁止
TIM1->CCER|=1<<0; //TIM3 OC1 输出使能
TIM2->CCER|=1<<8; //TIM2 OC1 输出使能
switch (speed)
{
case 0:
{
Moter1_CH3_Value=390;
Moter2_CH3_Value=350;
break;
}
case 1:
{
Moter1_CH3_Value=450;
Moter2_CH3_Value=440;
break;
}
}
}
void Motor_Left1(u16 value)
{
TIM2->CCER|=1<<8; //OC3 输出使能
TIM2->CCER&=~(1<<12); //OC4 输出禁止
TIM1->CCER|=1<<12; //OC4 输出使能
TIM1->CCER&=~(1<<0); //OC3 输出禁止
Moter1_CH3_Value=150;
Moter2_CH4_Value=300;
delay_ms(value);
TIM1->CCER&=~(1<<12); //OC4 输出禁止
TIM2->CCER&=~(1<<8); //OC3 输出使能
}
void Motor_Right1(u16 value)
{
TIM1->CCER|=1<<0; //TIM3 OC1 输出使能
TIM2->CCER&=~(1<<8); //OC3 输出禁止
TIM2->CCER|=1<<12; //OC4 输出使能
TIM1->CCER&=~(1<<12); //OC4 输出禁止
Moter2_CH3_Value=300;
Moter1_CH4_Value=150;
delay_ms(value);
TIM2->CCER&=~(1<<12); //OC4 输出禁止
TIM1->CCER&=~(1<<0); //OC3 输出使能
}
void Motor_Left2(u16 value)
{
Moter2_CH3_Value=990;
Moter1_CH3_Value=410;
delay_ms(value);
}
void Motor_Right2(u16 value)
{
Moter1_CH3_Value=990;
Moter2_CH3_Value=350;
delay_ms(value);
}
void Motor_Back(void)
{
TIM1->CCER|=1<<12; //OC4 输出使能
TIM2->CCER|=1<<12; //OC4 输出使能
TIM2->CCER&=~(1<<8); //OC3 输出禁止
TIM1->CCER&=~(1<<0); //OC3 输出禁止
Moter1_CH4_Value=50;
Moter2_CH4_Value=50;
}