51单片机使用L298驱动只有一个JGB37-520编码器电机用pwm调节电机速度,并实现正反转,测量电机速度(编码器adc0832)并使用lcd显示转速代码(全程只有一个电机)
时间: 2023-06-25 10:03:01 浏览: 158
基于51单片机的PWM电机转速控制
下面是51单片机使用L298驱动控制JGB37-520编码器电机,实现正反转和测量电机速度,同时使用LCD显示转速的代码。该代码使用了PWM调节电机速度和ADC0832模块来测量电机速度。
```
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit EN = P2^0; //L298使能引脚
sbit IN1 = P2^1; //L298控制引脚1
sbit IN2 = P2^2; //L298控制引脚2
sbit E = P3^7; //LCD1602使能引脚
sbit RS = P3^5; //LCD1602数据/命令选择引脚
//ADC0832模块引脚定义
sbit ADC_CS = P1^0;
sbit ADC_CLK = P1^1;
sbit ADC_DIO = P1^2;
uchar code table[] = "0123456789"; //数字显示表
void delay(uint ms) //延时函数
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<114;j++);
}
void write_com(uchar com) //LCD写入命令函数
{
RS = 0;
P0 = com;
delay(5);
E = 1;
delay(5);
E = 0;
}
void write_data(uchar dat) //LCD写入数据函数
{
RS = 1;
P0 = dat;
delay(5);
E = 1;
delay(5);
E = 0;
}
void init_lcd() //LCD初始化函数
{
write_com(0x38); //初始化显示模式,16*2显示,5*7点阵,8位数据
write_com(0x0c); //开显示,不显示光标,不闪烁
write_com(0x06); //写入数据后光标右移一位
write_com(0x01); //清屏
}
void init_adc() //ADC0832初始化函数
{
ADC_CS = 1;
ADC_CLK = 0;
}
uchar read_adc() //ADC0832读取函数
{
uchar i,dat = 0;
ADC_CS = 0;
ADC_CLK = 0;
_nop_();
ADC_CS = 1;
_nop_();
for(i=0;i<8;i++)
{
ADC_CLK = 1;
dat <<= 1;
if(ADC_DIO == 1) dat++;
ADC_CLK = 0;
}
return dat;
}
void main()
{
uint speed = 0;
init_adc();
init_lcd();
while(1)
{
EN = 1;
IN1 = 1;
IN2 = 0; //正转
speed = read_adc(); //读取电机速度
write_com(0x80); //设置显示位置为第一行第一列
write_data('S');
write_data('P');
write_data('E');
write_data('E');
write_data('D');
write_data(':');
write_data(table[speed/100]); //显示百位数字
write_data(table[speed%100/10]); //显示十位数字
write_data(table[speed%10]); //显示个位数字
delay(100);
IN1 = 0;
IN2 = 1; //反转
speed = read_adc(); //读取电机速度
write_com(0xc0); //设置显示位置为第二行第一列
write_data('S');
write_data('P');
write_data('E');
write_data('E');
write_data('D');
write_data(':');
write_data(table[speed/100]); //显示百位数字
write_data(table[speed%100/10]); //显示十位数字
write_data(table[speed%10]); //显示个位数字
delay(100);
}
}
```
注意:该代码只使用了一个电机,并且是通过PWM调节电机速度的。如果需要控制多个电机,需要对代码进行相应的修改。同时,ADC0832读取到的数据需要进行转换才能得到实际的电机速度。具体转换方法可以参考ADC0832模块的数据手册。
阅读全文