2018 0627 STM32 ----PWM直流电机调速(L298N驱动连接)

利用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 时候出现过这个问题


注意: 施加过高的频率,即过高频率的输出电压由于感抗作用会使得电流很小,就会导致电机‘无力’,并且发热严重。


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页