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


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


  • 70
    点赞
  • 494
    收藏
    觉得还不错? 一键收藏
  • 52
    评论
基于STM32单片机的直流电机PWM调速控制系统设计主要需要使用L298N驱动和霍尔传感器测速。 首先,我们可以使用STM32单片机的定时器功能来产生PWM调速信号。通过设置定时器的工作模式、预分频系数和计数器的重载值,可以实现不同频率和占空比的PWM波形输出。可以根据具体的需求,调整PWM信号的频率和占空比,以控制直流电机的转速。 然后,需要使用L298N驱动芯片来驱动直流电机L298N驱动芯片可以提供双通道的H桥驱动功能,可以通过控制IN1、IN2、IN3和IN4四个引脚的电平来实现电机的正转、反转和制动。将STM32单片机的输出引脚连接L298N驱动芯片的控制引脚上,就可以通过改变这些引脚的电平信号,实现直流电机的正转、反转和速度调节。 同时,为了实现对直流电机的速度进行测量,可以使用霍尔传感器进行测速。霍尔传感器是一种利用霍尔效应来检测磁场的传感器,可以检测到电机旋转时的磁场变化,并转换成电压信号输出。通过连接霍尔传感器的输出引脚到STM32单片机的输入引脚,可以读取到电机的转速信号。根据霍尔传感器输出信号的变化频率和转速的线性关系,可以实时监测电机的转速,并反馈给控制系统进行速度调节。 综上所述,基于STM32单片机的直流电机PWM调速控制系统设计使用L298N驱动和霍尔传感器测速,可以实现对直流电机的速度控制和测量。通过调节PWM信号的频率和占空比,以及控制L298N驱动芯片的输出引脚电平,可以实现对电机的转速调节。通过读取霍尔传感器的输出信号,可以实时监测电机的转速。这样的设计可以应用在许多需要精确控制和监测电机转速的应用场景中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 52
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值