IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 51单片机-PWM调速(直流电机,智能小车的电机调速) -> 正文阅读

[嵌入式]51单片机-PWM调速(直流电机,智能小车的电机调速)


前言

这次来对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对小车的速度进行控制

加油加油!

希望本文对你有帮助。

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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:42:58  更:2022-11-05 00:45:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/25 13:18:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码