利用STM32 PB6口输出PWM 控制直流电机的速度,用L298N驱动器驱动。
硬件连接部分:
1. 输入12V
2.接地
3.输出5V
4.5 连接STM32的io
6.7 连接直流电机输入端
注:连接完成后还要有一个连接,就是将STM32的GND跟电源输入端GND连接在一起,否则电机不会转动,会出现一直抖动的情况。
原理:利用STM32 的IO输出不同占空比的脉冲信号来达到调速的过程,当占空比大的时候就表明在一个脉冲周期内高电平的时间越长,而脉冲信号输出频率极快,高电平的时间越长就表明在一段时间内IO口输出的控制电压越高,控制电压越高使得L298N输出的电压越高,这样就使得车轮的转速越快。
软件部分:
PWM.H
#ifndef __PWM__H
#define __PWM__H
#include "sys.h"
#include "stm32f10x.h"
void TiM4_PWM_Init(u16 value ) ;
#endif
PWM.c
#include "PWM.h"
void TiM4_PWM_Init(u16 value )
{
TIM_TimeBaseInitTypeDef TIM_Timeinit;
TIM_OCInitTypeDef TIM_OCInitstruct;
GPIO_InitTypeDef GPIO_InitStrucyure;
/////////////// 1
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //使能定时器4时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); // 使能GPIO
GPIO_InitStrucyure.GPIO_Mode=GPIO_Mode_AF_PP; //改为复用推挽输出GPIO_Mode_AF_PP
GPIO_InitStrucyure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStrucyure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStrucyure); //初始化io口
TIM_Timeinit.TIM_ClockDivision = TIM_CKD_DIV1 ; //
TIM_Timeinit.TIM_CounterMode = TIM_CounterMode_Up; //计数模式
TIM_Timeinit.TIM_Prescaler = 0; //预分频系数为0 则频率为不分频 72mhz/1 = 72Mhz
TIM_Timeinit.TIM_Period = 7199; // 72MHZ /(7199+1) = 10KHZ 7199 为计数总值
TIM_TimeBaseInit(TIM4,&TIM_Timeinit);
TIM_OCInitstruct.TIM_Pulse = value; //占空比 这里是0-2399
TIM_OCInitstruct.TIM_OCMode = TIM_OCMode_PWM2 ; //模式2
TIM_OCInitstruct.TIM_OCNPolarity = TIM_OCPolarity_High ; //极性输出高
TIM_OCInitstruct.TIM_OutputState = TIM_OutputState_Enable ; //
TIM_OC1Init(TIM4,&TIM_OCInitstruct); //TIM_OCX 通道1 就OC1
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_Cmd(TIM4,ENABLE); //使能定时器
}
这里利用的是 TIM_OCInitstruct.TIM_Pulse = value ;来实现不同的占空比,这里意思是计数器开始计数,直到到达value这个数值之前输出低电平,到达之后的输出高电平,value的值在(0-7199)之间。
利用PB6口对用的定时器4通道1输出PWM
假设主函数中调用
int main(void)
{
TiM4_PWM_Init(0);
}
那么根据分析应该输出全都是高电平,利用上一篇的KILE5自带的仿真验证
没有错误。
假设再主函数中调用
int main(void)
{
TiM4_PWM_Init(3200);
}
应该输出一个占空比为0.5的波形图。
仿真没有错,将程序导入硬件时,直流电机能够被调节速度
注意几点:
1.电机启动了可是电机出现噪声,这是我们设置输出的PWM波的频率太低了,
TIM_Timeinit.TIM_Prescaler = 0; //预分频系数为0 则频率为不分频 72mhz/1 = 72Mhz
TIM_Timeinit.TIM_Period = 7199; // 72MHZ /(7199+1) = 10KHZ 7199 为计数总值
这样设置的时候输出的是10KHZ频率的PWM,可设置高一些 如 0 899,这样输出的是80KHZ的波形
2.L298N 发热严重有臭味,这是频率设置太高的原因,导致元件的发热严重,当我设置为 0 899 时候出现过这个问题
注意: 施加过高的频率,即过高频率的输出电压由于感抗作用会使得电流很小,就会导致电机‘无力’,并且发热严重。