L298N驱动模块---51单片机代码

L298N驱动模块详解与代码

在这里插入图片描述

使能:开关
跳线帽:内部有金属接线,使用跳线帽在使能时,该开关短路,使能关闭
注意:电机与51单片机的接地点应接到一处
另:因为51单片机的电源是5v,可以将模块上的5V输出给到51单片机,就可以不用再另给51单片机连接一个电源
在这里插入图片描述

使能:开关
跳线帽:内部有金属接线,使用跳线帽在使能时,该开关短路,使能关闭
pwm频率:每秒钟信号从高电平到低电平再回到高电平的次数(频率高低与输出响应的速度相关)
占空比:高电平持续时间占总周期的比例
程序设计:
//此程序的目的是进行占空比为30%的一个使用pwm调速法控制的电机 pwm频率为1000hz也就是1ms,我们选择一次定时中断用时0.01ms,一共要100次中断才达到1ms,设置初值方面,因为晶振频率约为12mhz,所以一个机械周期约为1us也就是0.001ms,以此对应设置初值。

#include<reg52.h> 
void main()
{
        ENA = 1;
	IN1 = 0;
	IN2 = 1;   //正转
	set();
	while(1)
	{			
	}			
}
void set()
{
	TMOD=0x01;//定时器0工作方式1
	TH0=a;//(65536-100)/256;//赋初值定时
	TL0=b;//(65536-100)%256;//0.01ms
	EA=1;//开总中断
	ET0=1;//开定时器0中断
	TR0=1;//启动定时器0 
} 
void tim0() interrupt 1
{
	TR0=0;//赋初值时,关闭定时器
	TH0=a;//(65536-10)/256;//赋初值定时
	TL0=b;//(65536-10)%256;//0.01ms
	TR0=1;//打开定时器
 
	time++;
	if(time>=100)  //1khz
	  time=0;   
	if(time<=30)   //占空比%30,可改
	  IN1 = 0,IN2 = 1;  
	else 
      IN1 = 1,IN2 = 0;
}

这段代码展示了如何使用PWM(脉宽调制)技术控制电机速度,其中占空比为30%,PWM频率为1000Hz(即1ms)。下面详细讲解其核心功能、原理及改进要点。

代码解读

  1. 硬件使能与跳线帽

    • 使能开关(ENA = 1):在程序中,ENA用于控制电机使能状态。高电平(ENA = 1)使能电机。
    • 跳线帽:在使能时,跳线帽使开关短路,关闭使能功能。注意在接线时,电机和单片机的接地点必须共地,以保证电气连接的正确性。
  2. PWM频率和占空比

    • PWM频率:程序中设定为1000Hz,即1ms周期。PWM频率定义了信号从高电平到低电平再回到高电平的速度,影响电机响应的速度。
    • 占空比:设定为30%,即在每个周期内有30%的时间保持高电平,70%的时间保持低电平。这将直接控制电机的转速。
  3. 定时器设置

    • 程序使用51单片机的定时器0来生成定时中断,计算每次中断的时间周期。通过定时中断生成的PWM波形,可以精确控制电机的运行状态。

详细代码讲解

主程序部分
#include<reg52.h> 

void main()
{
    ENA = 1;  // 使能电机
    IN1 = 0;  // 设置电机方向
    IN2 = 1;  // 正转
    set();    // 设置定时器
    while(1)
    {
        // 主循环等待定时器中断控制PWM
    }			
}
  • ENA = 1;:开启电机使能。
  • IN1 = 0;IN2 = 1;:设置电机正转,IN1IN2控制电机的转动方向。
  • set():调用定时器设置函数,开始计时。
定时器设置函数
void set()
{
    TMOD = 0x01;  // 定时器0工作方式1(16位定时器)
    TH0 = a;      // 高位初值
    TL0 = b;      // 低位初值(用于0.01ms定时)
    EA = 1;       // 开启总中断
    ET0 = 1;      // 开启定时器0中断
    TR0 = 1;      // 启动定时器0
}
  • TMOD = 0x01;:选择定时器0的工作方式1(16位定时器模式)。
  • TH0TL0:定时器初值设置,这里ab根据0.01ms的定时周期来设置,实际计算公式见后续解释。
  • EA = 1;ET0 = 1;:分别开启总中断和定时器0中断。
  • TR0 = 1;:启动定时器0。
定时中断函数
void tim0() interrupt 1
{
    TR0 = 0;       // 关闭定时器
    TH0 = a;       // 重新加载初值
    TL0 = b;
    TR0 = 1;       // 重新启动定时器

    time++;        // 时间计数器自增
    if(time >= 100)  // 每100次中断为1ms (1kHz PWM频率)
        time = 0;  
    if(time <= 30)   // 占空比30%,控制电机转动
    {
        IN1 = 0;
        IN2 = 1;
    }  
    else            // 剩余70%时间保持关闭
    {
        IN1 = 1;
        IN2 = 0;
    }
}
  • 定时中断函数通过计数来产生PWM信号,time变量每次中断增加1,达到100次中断后重置(对应1ms周期,1000Hz频率)。
  • time小于等于30时,保持高电平输出;当大于30时,保持低电平输出,形成30%的占空比。

关键原理说明

  1. PWM调速原理

    • PWM通过改变信号的占空比来控制电机速度。占空比越高,电机接收到的有效功率越多,转速越快。反之,占空比低,电机转速也会变慢。
  2. 定时器中断周期
    高位初值为TH0 = 65526 / 256,低位初值为TL0 = 65526 % 256

  3. 电机正反转控制

    • 通过IN1IN2的状态控制电机的正反转。在高电平时,电机会按照设定的方向转动。

改进与扩展

  • 更改占空比和频率:可以通过调整定时中断中的time计数范围和占空比条件(如if(time <= 30))来更改占空比。如果需要更高频率的PWM,则需调整定时器中断的频率。
  • 使用定时器方式2:如果需要更简单的初值设定,可以使用定时器的工作方式2,该方式的初值为8位自动重装载模式,简化了中断处理。

总结

这段代码展示了如何使用PWM控制电机速度,核心是通过定时中断精确控制信号的高低电平时间,从而调整电机的工作状态。通过合理设置定时器、PWM频率和占空比,能够灵活实现对电机的精确控制。

### 使用STM32 HAL库编写L298N电机驱动器的示例 为了实现基于STM32微控制器平台上的L298N直流电机控制,可以利用STMicroelectronics提供的硬件抽象层(HAL)库简化外设访问操作。下面是一个简单的例子展示如何初始化并操控连接到L298N模块的电机。 #### 初始化GPIO引脚用于PWM信号输出 首先定义将要使用的定时器通道以及对应的GPIO端口和引脚编号: ```c // 定义TIMx定时器及其对应PWM输出管脚 #define MOTOR_PWM_TIM TIM1 #define MOTOR_PWM_CHANNEL TIM_CHANNEL_1 #define MOTOR_IN1_GPIO_PORT GPIOA #define MOTOR_IN1_PIN GPIO_PIN_8 #define MOTOR_IN2_GPIO_PORT GPIOA #define MOTOR_IN2_PIN GPIO_PIN_9 ``` 接着,在`main.c`文件中的`MX_GPIO_Init()`函数里设置这些引脚模式为复用推挽输出型态,并启用相应的时钟源[^1]。 #### 配置定时器产生PWM波形 通过调用如下代码片段完成对指定定时器实例化对象属性设定工作,包括预分频系数、计数周期长度等参数调整;同时开启自动重装载功能以便循环生成连续脉冲序列作为速度调节依据。 ```c static void MX_TIM1_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim1.Instance = MOTOR_PWM_TIM; htim1.Init.Prescaler = 83; // 设置频率为20KHz (SystemCoreClock/(Prescaler+1)/ARR=20kHz) htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 999; // PWM占空比范围0~100% htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; // 初始占空比为0% sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, MOTOR_PWM_CHANNEL) != HAL_OK) { Error_Handler(); } } ``` 上述配置完成后记得还要启动相应中断服务程序(ISR),确保能够响应外部事件触发条件下的即时处理需求。 #### 控制方向逻辑 针对IN1/IN2输入端子高低电平组合决定马达转向特性这一事实,可以通过改变这两个IO状态达到反转目的: ```c void SetMotorDirection(int direction){ switch(direction){ case FORWARD: HAL_GPIO_WritePin(MOTOR_IN1_GPIO_PORT,MOTOR_IN1_PIN,GPIO_PIN_SET); HAL_GPIO_WritePin(MOTOR_IN2_GPIO_PORT,MOTOR_IN2_PIN,GPIO_PIN_RESET); break; case BACKWARD: HAL_GPIO_WritePin(MOTOR_IN1_GPIO_PORT,MOTOR_IN1_PIN,GPIO_PIN_RESET); HAL_GPIO_WritePin(MOTOR_IN2_GPIO_PORT,MOTOR_IN2_PIN,GPIO_PIN_SET); break; default:// STOP HAL_GPIO_WritePin(MOTOR_IN1_GPIO_PORT,MOTOR_IN1_PIN,GPIO_PIN_RESET); HAL_GPIO_WritePin(MOTOR_IN2_GPIO_PORT,MOTOR_IN2_PIN,GPIO_PIN_RESET); } } ``` 最后就是根据实际应用场景灵活运用以上接口函数去构建完整的运动控制系统了!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lucas在澳洲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值