51 PWM调速蓝牙小车

文章目录


前言

当你看到无人机升天、平衡车的落地以及超声波避障等技术的应用,想必已经勾起了你的兴趣!然而这又与STM32技术紧密相关,如果此时你已经决心要加入到STM32的学习当中,想要快速入门那必定少不了51单片机的固基,本章就是对51知识的实际运用!


一、硬件配置

小车车体

 芯片STC89C52

 L2

 L298N电机驱动模块

 HC-05蓝牙模块

 驱动电源

二、相关接线

1.L298N驱动模块

 ①OUT1~OUT4:输出端,用于连接电机,注意:“如果用到PWM调速,OUT1和OUT2由使能端ENA控制,OUT3和OUT4由使能端ENB控制。”

②12V:为电源的输入端

③GND:实现L298N与CPU共地(接地)

⑤5V:输出电源的输出端,用于给CPU供电

⑥IN1~IN4:电机控制的输入端,便于CPU对电机的控制

⑦ENA、ENB:使能端口,用于PWM调速

2、HC-05蓝牙模块

①GND: 实现与CPU共地

②VCC:连接CPU的电源引脚,实现蓝牙的通电

③RXD: 信息接收(连接CPU上的TXD)

③TXD: 信息接收(连接CPU上的RXD)

3、接线图解

三、PWM调速

调速的关键在于:“调节占空比”。关键是怎么调节呢?此时,我们会用到定时器,定时器的作用是设定一个周期,只要我们调节在一个周期内,高电平与低电平的占比就可以实现调速。

占空比:就是高电平在一个周期所占的比例。

代码如下:

void time0_uart() interrupt 1
{
		TH0=0XFF;			
		TL0=0X9C;

		if(tempt==200)
		{
			ENA=0;
			ENB=0;
			tempt=0; //ÖØÐÂÇåÁã
		}
		if(tempt>pwm_ena)
		{
			ENA=1;
		}
		if(tempt<=pwm_ena)
		{
			ENA=0;
		}
		
		
		if(tempt>pwm_enb)
		{
			ENB=1;
		}
		if(tempt<=pwm_enb)
		{
			ENB=0;
		}
		tempt++;
}

四、完整代码 

定时器初始化 (Time_init()):

void Time0_init()    //定时器初始化
{
	TMOD|=0X01;   //选择定时器0,工作方式1

	TH0=0XFF;			//给定时器赋初值,定时0.3ms
	TL0=0X9C;	
	ET0=1; 				//打开定时器0 中断允许
	EA=1;				//´打开总中断
	TR0=1;				//打开定时器			
}

串口中断初始化(URAT_init()): 

void Uart_init()
{
	TMOD |=0X20;  //设置计数器工作方式2
	SCON=0X50;    //设置串口为工作方式1
	PCON=0X80;    //波特率加倍
	
	TH1=0XFA;     //波特率9600
	TL1=0XFA;     //计数器初值设置
	TR1=1;				//打开计数器
	ES=1;         //打开接收中断
	EA=1;					//打开总中断
}

完整代码如下:

#include <REG51.H>


sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;

sbit ENA=P1^4;
sbit ENB=P1^5;

unsigned int pwm_ena=0;   //应用于pwm调速
unsigned int pwm_enb=0;
unsigned int tempt=0;     //pwm调速的计数值





//void Time0_init()    //定时器初始化
//{
//	TMOD|=0X01;   //选择为定时器0模式,工作方式1,

//	TH0=0XFF;			//给定时器赋初值,定时0.3ms
//	TL0=0X9C;	
//	ET0=1; 				//打开定时器0中断允许
//	EA=1;				  //打开总中断
//	TR0=1;				//打开定时器			
//}


void forward(void)    //小车前进
{
	IN1=1;
	IN2=0;
	IN3=1;
	IN4=0;
	pwm_ena=120;      //占空比40%
	pwm_enb=120;
}

void back(void)        //小车后退
{
	IN1=0;
	IN2=1;
	IN3=0;
	IN4=1;
	pwm_ena=120;       //占空比40%
	pwm_enb=120;
}

void turn_right(void)       //小车右转
{
	IN1=1;
	IN2=0;
	IN3=0;
	IN4=1;
	pwm_ena=150;        //占空比25%
	pwm_enb=150;
}

void turn_left(void)        //小车左转
{
	IN1=0;
	IN2=1;
	IN3=1;
	IN4=0;
	pwm_ena=150;        //占空比25%
	pwm_enb=150;
}

void stop(void)        //小车停止
{
	IN1=1;
	IN2=1;
	IN3=1;
	IN4=1;
}


//void uart_init()
//{
//	TMOD |=0X20;  //设置计数器工作方式2
//	SCON=0X50;    //设置工作方式1
//	PCON=0X80;    //波特率加倍
//	
//	TH1=0XFA;     //波特率9600
//	TL1=0XFA;     //计数器初值设置
//	TR1=1;				//打开计数器
//	ES=1;         //打开接收中断
//	EA=1;					//打开总中断
//}
	

void main()
{
	Time0_init();
	uart_init();
	
	while(1)
	{
		
	}
}


void time0_uart() interrupt 1
{
		TH0=0XFF;			
		TL0=0X9C;

		if(tempt==200)
		{
			ENA=0;
			ENB=0;
			tempt=0; //ÖØÐÂÇåÁã
		}
		if(tempt>pwm_ena)
		{
			ENA=1;
		}
		if(tempt<=pwm_ena)
		{
			ENA=0;
		}
		
		
		if(tempt>pwm_enb)
		{
			ENB=1;
		}
		if(tempt<=pwm_enb)
		{
			ENB=0;
		}
		tempt++;
}

void uart() interrupt 4
{
	unsigned char S;
	if(RI==1)  
	{
		stop();
		S=SBUF;
		switch(S)  
		{
			case ('1'):  
				forward();break;
			case ('2'):  
				back();break;
			case ('3'):
				turn_right();break;
			case ('4'):
				turn_left();break;
			case ('0'):
				stop();break;
  } 
  RI=0;
}


}

之所以会有注释那部分,主要在于:“我应用了模块化编程” ,还需注意的是定时器,我定时为0.3ms,建议:“如果刚刚开始调速,可能会出现一顿一顿的情况,此时你可以,将定时器的计时周期时间减小,然后慢慢调节,直至消除一顿一顿的现象”


总结

以上是我学习并实践后,对51小车制作的讲解,本章只是简单的介绍了PWM调速,而且PWM调速也是学习51后要进行掌握的,以上只是提供一个参考的程序,具体该如何的调速以及代码的编程还需要借鉴者的自身感悟还有知识的掌握程度等等,希望我的文章可以给正在开发的你带来些许灵感,踏上51的毕业之路!
 

  • 6
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 您好,stm32f103c8t6pwm调速小车是一种基于STM32F103C8T6微控制器和PWM调速电机驱动模块的小车。通过控制PWM信号的占空比,可以实现小车的速度调节。同时,还可以通过加装传感器模块,实现小车的自动避障、跟随等功能。需要注意的是,对于初学者来说,需要具备一定的电路设计和编程基础才能完成该项目。 ### 回答2: 首先介绍一下STM32F103C8T6芯片,它是一款嵌入式微控制器,具有高性能、低功耗、丰富的外设和强大的通信协议接口,被广泛应用于工业自动化、消费电子、汽车电子等领域。 在小车的调速方面,我们可以利用STM32F103C8T6的PWM输出功能控制电机的转速。PWM即脉冲宽度调制,通过改变脉冲的宽度来控制电机的转速,PWM的频率一般需要设置为几十KHz,这可以通过STM32的时钟计数器地址寄存器来设置。 同时,我们还需要使用一些传感器来获取小车的速度、方向等信息,如光电编码器、陀螺仪等。这些传感器可以通过STM32的外设接口(如TIM、SPI、I2C等)来与芯片连接,通过对传感器数据的采集和处理,实现小车的精确调速和导航。 此外,为了更好地控制小车的运行,我们还需要设计一个完善的控制系统,如PID控制器,来对小车进行闭环控制。PID控制器可以根据小车当前状态与目标状态之间的差异来同时调整PWM输出和方向控制,从而实现小车的自动调速和行驶路线控制。 最后,为了保证小车的稳定性和安全性,我们需要对其进行充分测试和调试,如反复检验控制系统的稳定性、测试电机的最大转速和最小启动电压、以及制作一份详细的调试报告等,确保小车在各种情况下都能稳定运行和行驶。 ### 回答3: STM32F103C8T6是一款强大的32位微控制器,它不仅具有高性能、高精度,还能够通过PWM调速控制小车的速度。 PWM是脉宽调制的缩写,它是通过不同占空比的方波信号来控制电机转速的一种技术。在PWM调速中,通过改变PWM信号的占空比大小来控制电机的速度,当占空比变大时,电机转速变快,当占空比变小时,电机转速变慢。 在STM32F103C8T6上,我们可以使用它的定时器和GPIO模块来实现PWM调速功能。首先,我们需要选择一个定时器作为PWM输出的源头,并设置其预分频系数和重载值。然后,我们可以通过GPIO模块来控制PWM的输出,即通过设置GPIO引脚的输出模式和输出电平来控制PWM信号的占空比大小。 以小车为例,我们可以将左右轮的电机分别接到STM32F103C8T6的两个PWM输出引脚上,分别控制左右轮的速度。我们可以通过一个控制器来采集小车上的传感器数据,并将其发送到STM32F103C8T6上进行实时处理,计算出需要的PWM占空比,并通过GPIO模块发送PWM信号,从而实现小车的前进、后退、左转和右转。 在实现PWM调速小车时,我们还需要注意以下事项: 1. PWM信号的频率应与电机控制器要求的频率相匹配,一般为20KHz左右。 2. 要注意匹配PWM信号的占空比范围,不能超出电机控制器的工作范围,否则可能会烧坏电机。 3. 在计算PWM占空比时,需要考虑小车当前的速度和方向,以保证小车的稳定运行和转向灵活。 4. 为了避免电路干扰和电机带来的电磁干扰,需要注意电路的接地和滤波等问题。 通过合理地设置PWM信号的频率和占空比,结合传感器数据的实时处理,我们可以实现一个灵活、稳定且高效的PWM调速小车。同时,STM32F103C8T6的高性能和可靠性,也为小车的运行提供了强有力的保障。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值