PWM的介绍已经详细讲解过了,就不做过多的介绍,可以去翻看主页关于PWM的介绍.
要想通过单片机直接去驱动电机转到,是实现不了的,因为单片机内部全部是0,1这种数字信号,驱动的电压可以带不动电机的转到,就要使用到电机的驱动芯片,常用的电机驱动芯片有tb6612,l298n,俩款的驱动方式雷同,没有很大的区别,下面详细介绍以l298n为例驱动直流电机调速。
一.如图所示为L298N的结构组成部分

1.12v电压输入,GND供地端,5v我自己认为是输出一个5v的接口但是不是特别确定就不做详细的介绍。
2.使能端,L298N有俩个使能端口,分别是ENA和ENB,用一个跳线帽接在板载5v上面,逻辑输入数字信号0,1就可以在相应得输出端输出信号,因为在只有数字信号0,1所以并不能实现电机的调速,只能实现电机的左右转。调速就把跳线帽拔下来,用一个PWM信号脉冲波接着使能端,也就是ENA或ENB,这样就能通过控制PWM的占空比来实现电机的调速。
3逻辑输入端口,IN1-IN4四个输入口,对应着相应的输出端口,给0,1就能控制电机的正反转
4.输出口应用控制,接电机的正反极,不分正负极随便接都行。
二.原理图

三.使用说明
1.直流电机的驱动:
L298N能输出俩路控制俩个电机转动,使能端ENA和ENB高电平有效。
如图所示以ENA举例控制真值表:

我们需要对电机进行调速,需要设置IN1,IN2确定电机的转动方向,然后拔掉跳线帽接上PWM信号。调整占空比就可以实现电机的调速,注意当使能端信号为0时电机处于停止状态,当使能端为1,逻辑输入全部为0或1的时候电机制动,会阻止电机转动,只有逻辑输入为01或10的时候电机才会正常转动。
四.基于STM32的驱动代码
PWM初始化
void pwm_int(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure; //定义结构体
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能定时器2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //使能PA0引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口的输出速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //IO引脚模式,复用推挽模式
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA
TIM_TimeBaseStructure.TIM_Period = arr;//下一个更新事件载入活动的自动重装载寄存器周期值
TIM_TimeBaseStructure.TIM_Prescaler = psc; // 预分频值,不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);// 初始化时钟基数单位
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //脉宽调制模式2
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性为高
TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable; //比较输出使能
TIM_OC1Init(TIM2, &TIM_OCInitStructure); // 初始化TIM2定时器
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能预装载寄存器
TIM_ARRPreloadConfig(TIM2, ENABLE); //使能自动装载允许位
TIM_Cmd(TIM2, ENABLE); //使能定时器
}
电机初始化
void Gpio_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //结构体
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_9; //PB5 PB9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB
}
主函数
int main(void)
{
SystemInit(); //系统时钟
delay_init(); //延时函数初始化
motro_Init(); //电机初始化
pwm_int(7199,0); //PWM初始化
while(1)
{
GPIO_SetBits(GPIOB, GPIO_Pin_7); // 低电平
GPIO_ResetBits(GPIOB, GPIO_Pin_9); // 高电平
TIM_SetCompare1(TIM4,7000); //PWM占空比
}
}
如有不对请指出。
驱动俩路电机介绍:L298N驱动俩路电机按键控制正反转_m0_63171897的博客-CSDN博客
完整工程代码:STM32,L298N驱动模块驱动直流电机调速-单片机文档类资源-CSDN文库
(编辑:92站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|