51单片机使用L298驱动一个JGB37-520编码器电机用pwm调节电机速度,并实现正反转,测量电机速度(编码器adc0832)并使用lcd显示转速代码
时间: 2023-06-20 08:10:16 浏览: 111
基于51单片机的PWM电机转速控制
以下是51单片机使用L298驱动JGB37-520编码器电机用pwm调节电机速度,并实现正反转,测量电机速度并使用lcd显示转速的代码:
```
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define MOTO P1
// 函数声明
void delay(uint i); // 延时函数
void init_pwm(); // 初始化pwm
void forward(); // 正转
void backward(); // 反转
void stop(); // 停止
uint get_speed(); // 获取速度
// 全局变量
uint speed = 0; // 速度
uchar str[16]; // 存放速度的字符串
void main()
{
init_pwm(); // 初始化pwm
while(1)
{
forward(); // 正转
delay(1000); // 延时1秒
backward(); // 反转
delay(1000); // 延时1秒
stop(); // 停止
speed = get_speed(); // 获取速度
sprintf(str, "Speed: %d", speed); // 将速度转换为字符串
lcd_display(str); // 在LCD上显示速度
}
}
void delay(uint i)
{
while(i--);
}
void init_pwm()
{
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xfc; // 设置定时器0初值
TL0 = 0xfc;
ET0 = 1; // 打开定时器0中断
TR0 = 1; // 启动定时器0
EA = 1; // 打开总中断
}
void forward()
{
MOTO = 0x06; // 电机正转
}
void backward()
{
MOTO = 0x09; // 电机反转
}
void stop()
{
MOTO = 0x00; // 停止电机
}
uint get_speed()
{
uchar i = 0;
uint speed = 0;
uint adc_value = 0;
for(i=0; i<10; i++)
{
ADC_OUT = 1; // 启动ADC0832
ADC_OUT = 0;
ADC_OUT = 1;
while(EOC); // 等待ADC转换完成
adc_value += ADC_RES; // 累加ADC值
}
adc_value /= 10; // 取平均值
speed = adc_value * 100 / 1024; // 计算速度
return speed;
}
// 定时器0中断函数,用于产生pwm信号
void T0() interrupt 1
{
static uint cnt = 0;
cnt++;
if(cnt >= speed) // 控制占空比
{
MOTO = 0x00; // 关闭电机
}
if(cnt >= 100) // 每隔一段时间进行一次计数
{
cnt = 0;
}
}
```
其中,需要注意的几点是:
1. 需要定义一个 `ADC_OUT` 宏来控制ADC0832的启动和停止,以及定义 `EOC` 和 `ADC_RES` 来读取ADC值;
2. 定义一个 `lcd_display()` 函数用于在LCD上显示字符串,具体实现可以参考液晶显示模块的使用方法;
3. 在定时器0中断函数中,需要根据当前速度来控制占空比,从而实现pwm调节电机速度。
另外,需要注意的是,由于编码器电机的速度测量需要使用ADC0832模块,因此需要将其连接到单片机的外部引脚上,并在代码中进行相应的配置。此外,还需要连接液晶显示模块,并在代码中调用相应的函数来实现显示。
阅读全文