草庐IT

51单片机-PWM调速(直流电机,智能小车的电机调速)

藕粉- 2023-08-17 原文

文章目录


前言

这次来对PWM做一个总结

最近学习时,发现PWM控制在很多地方都会用到,比如使用PWM来控制电机的速度,使用PWM来生成想要的波形。

那么到底什么是PWM呢?


一、PWM

PWM即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效的获得所需要的模拟参量。

说白了就是通过控制高低电平的时间,来对输出的波形进行控制。

其中有几个重要的参数

  • 频率:频率等于周期频率除以1
  • 占空比:高电平在整个周期内所占的时间,即高电平和周期时间的比值
  • 精度:占空比变化的步距

二、产生PWM的方法

下方为江科大ppt教程ppt里的图就是通过定时器定时自增,设置一个比较值,然后通过判断计数器和比较值的大小,输出对应的高低电平

波形详解,就比如第一个周期内,小于比较值60的部分输出的是低电平,大于比较值60的部分输出高电平。两图的波形等效,PWM波形就这样产生了,控制不同的高低电平存在的时间,然后输出。

使用定时器产生一个恒定的周期

这里没有限制使用什么定时器,当使用多个定时器的时候,一定要注意不同定时器中断和外部中断的优先级,因为如果不同定时器的中断优先级不相同,就有可能一个优先级较高的定时器中断打破了当前定时器产生的中断。使当前中断失效。下方为中断优先级以及使用C语言编程使用到的中断号

例程序
定时器0产生恒定周期

#include <REGX52.H>

/**
  * @brief 定时器0初始化
  * @param  
  * @retval 
  */
void Timer0Init()   //100us  10ms  11.0592MHZ
{
	TMOD&=0xF0;  //高四位不变
	TMOD|=0x01;  //设置定时器模式1 以及设置为定时方式 0
	
	TL0 = 0xA4;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	
	TF0=0;  //定时器0溢出标志位
	TR0=1;  //定时器0运行控制位
	
	TF0=1;	//设置外部中断
	ET0=1;
	EA=1;
	PT0=0;
}

//中断函数
/*void Timer0_Rourine() interrupt 1
{
	static unsigned int T0count;
		TL0 = 0xA4;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	T0count++;
	if(T0count>=1000)
	{
		T0count=0;
		P2_0=~P2_0;
	}
}*/

中断服务子程序里设置比较值

和比较值相比较大小,可以自己设置究竟是大于比较值,输出高电平还是低电平,同时小于比较值也同理

void Timer0_Rourine() interrupt 1   //每隔100us进来一次
{
	TL0 = 0xA4;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	Counter++;
	if(Counter>=100){Counter=0;}
	if(Counter<Compare)  //小于比较值 输出高电平
	{
		out1=1;  //out代表输出高电平对应的管脚
	}
	else
	{
		out=0;
	}

三、实验

使用PWM对直流电机调速

通过按键控制直流电机的速度,使速度在数码管上显示,通过PWM调速
主程序
定时器0程序,和上方定时器0,程序相同

#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Timer0.h"
#include "NixieTube.h"

sbit motor=P1^0;   //电机端口
unsigned char Counter,Compare;   //counter 0-100 指的是频率 comapre 指的是占空比 高电平时间   Compare 最大值为100us
unsigned char KeyNum,Speed;
void main()
{
	Timer0Init();
	Compare=5;
	while(1)
	{
		KeyNum=Key();
		if(KeyNum==1)
		{
			Speed++;
			if(Speed>3){Speed=0;}
			if(Speed==0){Compare=0;}   //compare 指的就是占空比 
			if(Speed==1){Compare=50;}   //5%的占空比
			if(Speed==2){Compare=75;}
			if(Speed==3){Compare=100;}
		}
		NixieTube(8,Speed);
	}
}

void Timer0_Rourine() interrupt 1   //每隔100us进来一次
{
	TL0 = 0xA4;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	Counter++;
	if(Counter>=100){Counter=0;}
	if(Counter<Compare)
	{
		motor=1;
	}
	else
	{
		motor=0;
	}
}

使用PWM对智能小车的电机调速

直接上源程序啦
在做智能小车的时候肯定大概率会用到,如果你使用PID算法算我没说。
留个小坑,过段时间会把做智能小车遇到问题如何解决的文章分享给大家。
集成了红外循迹、红外避障、红外遥控功能
这个模块可以直接使用


/********************小车PWM输出****************/
/**
  * @brief 小车PWM输出  装载PWM输出,如果设置全局变量pwm_left,pwm_right分别配置左右输出高电平时间
  * @param  无
  * @retval 无
  */
void LoadPWM(void)
{
    if(pwm_left > PWM_HIGH_MAX)		pwm_left = PWM_HIGH_MAX;	//如果左输出写入大于最大占空比数据,则强制为最大占空比。
    if(pwm_left < PWM_HIGH_MIN)		pwm_left = PWM_HIGH_MIN;	//如果左输出写入小于最小占空比数据,则强制为最小占空比。
    if(pwm_right > PWM_HIGH_MAX)	pwm_right = PWM_HIGH_MAX;	//如果右输出写入大于最大占空比数据,则强制为最大占空比。
    if(pwm_right < PWM_HIGH_MIN)	pwm_right = PWM_HIGH_MIN;	//如果右输出写入小于最小占空比数据,则强制为最小占空比。
    if(pwm_val_left<=pwm_left)		Left_moto_pwm = 1;  //装载左PWM输出高电平时间
    else Left_moto_pwm = 0; 						    //装载左PWM输出低电平时间
    if(pwm_val_left>=PWM_DUTY)		pwm_val_left = 0;	//如果左对比值大于等于最大占空比数据,则为零

    if(pwm_val_right<=pwm_right)	Right_moto_pwm = 1; //装载右PWM输出高电平时间
    else Right_moto_pwm = 0; 							//装载右PWM输出低电平时间
    if(pwm_val_right>=PWM_DUTY)		pwm_val_right = 0;	//如果右对比值大于等于最大占空比数据,则为零
}

void Timer1_Routine() interrupt 3
{
    pwm_val_left++;
    pwm_val_right++;
    LoadPWM();//装载PWM输出
}

总结

说白了,PWM就是设置一个恒定的周期内,通过设置计时数和设置的比较值的大小,是在计时数比比较值小置高低电平,则要依据自己的需求来进行设置

这个PWM起初还不知道是啥,看了江科大第一遍视频没懂,第二遍懂了一点点,后面查看了好几个资料,摸着摸着不知道怎么就明白了个大概。

初始接触是应为江科大的视频里,一步一步跟下来

再接触是自己制作的智能小车的速度一直慢不下来,所以使用PWM对小车的速度进行控制

加油加油!

希望本文对你有帮助。

最后行文仓促,还请谅解,欢迎指错。

有关51单片机-PWM调速(直流电机,智能小车的电机调速)的更多相关文章

  1. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  2. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  3. 智能客服 | 浅谈人工智能聊天机器人ChatGPT - 2

    2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动

  4. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  5. 基于python的短视频智能推荐/django的影视网站/视频推荐系统 - 2

    摘要本论文主要论述了如何使用Python技术开发一个短视频智能推荐,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述短视频智能推荐的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 短视频智能推荐的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、热门视频管理、用户上传管理、系统管理,用户:首页、个人中心、用户上传管理、我的收藏管理,前台首页;首页、热门视频、用户上传、公告信息、个人中心、后台管理等功能。由于本网站的功能模块设计比较全面,所以使得整个短视频智能推荐信

  6. 51单片机——74HC595的应用(SPI实践) - 2

    目录SPI总线SPI总线概述 SPI总线分类SPI优点及缺点SPI接口硬件原理SPI四种工作模式 74HC595应用74HC595芯片概述74HC595封装及管脚功能74HC595工作原理 ​编辑 74HC595串行转并行点亮LED灯 程序实现  Proteus运行结构示意图SPI总线SPI总线概述 SPI(SerialPeripheralinterface):串行外围设备接口 用途:用来在微控制器与外围设备芯片之间实现数据交换 特点:高速、全双工、同步 SPI总线分类四线制全双工SPI(同时收发)MISO    主机输入/从机输出MOSI    主机输出/从机输入SCLK   串行时钟CS或

  7. 【毕业设计】基于单片机的智能温控农业大棚系统 - 物联网 stm32 - 2

    文章目录1简介2绪论2.1课题背景与目的3系统设计详细设计描述3.2硬件部分温度测量电路其他电路部分3.3软件部分主程序子系统程序温湿度程序流程键盘显示子程序3.4实现效果3.5部分相关代码4最后1简介Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目基于单片机的智能温控农业大棚系统大家可用于课程设计或毕业设计单片机-嵌入式毕设选题大全及项目分享:https://blog.csdn.net/m0_71572576/article/details/1254090522绪论2.1课题背景与目的近年来我国的温室控制取得了长足的进步,首先在温室群控制方面,进行了初步的探索和理论研究,其次在温室

  8. AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序 - 2

    一、概述在之前的一篇博文中,记录了AT24C01、AT24C02芯片的读写驱动,先将之前的相关文章include一下:1.IIC驱动:4位数码管显示模块TM1637芯片C语言驱动程序2.AT24C01/AT24C02读写:AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序本文记录分享AT24C04、AT24C08、AT24C16芯片的单片机C语言读写驱动程序。二、芯片对比介绍型号容量bit容量byte页数字节/页器件寻址位可寻址器件数WordAddress位数/字节数备注AT24C044k5123216A2A149/1WordAddress使用P0位AT24C088k1024

  9. 基于51单片机、DS1302时钟模块的电子闹钟设计 - 2

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、设计原理1.DS1302介绍2.闹钟音乐播放原理二、程序设计1.DS1302.h2.ds1302.c3.music.h4.main.c三、电路图四、运行结果1.proteus仿真2.开发板实验五、总结六、附件提示:以下是本篇文章正文内容,下面案例可供参考一、设计原理1.DS1302介绍DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。该芯片采用普通32.768kHz晶振,DS1302工作时功耗很

  10. [蓝桥杯单片机]学习笔记——串口通信的基本原理与应用 - 2

    目录一、原理部分1、什么是串行通信(1)并行通信与串行通信(2)串行通信的制式(3)串行通信的主要方式  2、配置串口(1)SCON和PCON:串行口1的控制寄存器(2)SBUF:串行口数据缓冲寄存器 (3)AUXR:辅助寄存器​编辑(4)ES、PS:与串行口1中断相关的寄存器(5)波特率设置  3、串口框架编写二、程序案例一、原理部分1、什么是串行通信(1)并行通信与串行通信微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。并行通信:数据的各位同时发送与接收,每个数据位使用一条导线,这种方式传输快,但是需要多条导线进行信号传输。串行通信:数据一位一

随机推荐