51单片机PWM控制LED的亮度仿真程序图谱 (附仿真文件+源代码)
51单片机PWM控制LED的亮度仿真程序图谱
因为项目比较简单,我就没有做实物,只是用了仿真来实现,大家最重要的是要弄懂原理。
原理:单片机输出PWM斩波,控制LED的亮度并在图谱上面显示出来
仿真开启
参考代码:
#include "reg51.h"
unsigned int cd,dd;
unsigned char cc,ee;
sbit LED=P2^0;
void led_int() interrupt 1 using 0
{
TH0=0xf1;
TL0=0xf1;
TR0=1;
dd++;
if(dd==11)
{
if((cc==0x50)&&(ee==0)){cd=0;}
if((cc==0)&&(ee==0x50)){cd=1;}
if(cd){cc++;ee--;}
else {cc--;ee++;}
dd=0;
}
}
void delay(unsigned int i)
{
unsigned int j;
while(i--)
{
for(j=0;j<0x20;j++);
}
}
void main()
{
cc=0;
ee=0x50;
TMOD=0x01;
TH0=0xf0;
TL0=0xf0 ;
EA=1;
ET0=1;
TR0=1;
while(1)
{
LED=0;
delay(ee);
LED=1;
delay(cc);
}
}
最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,
如果需要 程序完整源代码和 设计文件,请在下方留言或者私信我,看到后会第一时间回复。
谢谢!
感谢你的阅读,希望您有所收获,喜欢请点赞评论加关注!
STM32F0单片机 PWM + ADC 控制有刷电机
1. 有刷电机驱动电路
有刷电机是电机里面最简单,也是历史最悠久的一种,到现在仍然广泛应用于各个领域。他的控制很简单,在电机的两个电极加正向电压,则正向旋转,如果加反向电压,则旋转方向也反过来。电机的转速可以通过控制加在电极上的电压来调节。
在电机控制电路中最常用的器件就是 MOS 管了。可以分为两个大的类型:P 沟道 MOS 和 N 沟道 MOS。MOS 管可以简单的理解为一个自来水阀门,Gate 是控制端,调节 Drain 和 Source 端之间流过的电流大小。
下面是两种 MOS 的典型用法。P 沟道的 MOS 一般 S 接电源正极,然后 Vgs 需要一个负电压来打开电流通道,而 N 沟道的 S 极一般接电源的负极,Vgs 需要一个正电压来打开电流通道。
资料来源于 IOR 公司数据手册
我们先从一个最简单的驱动电路开始。单片机控制 MOS 管栅极为高时,电流从电源经过电机和 MOS 管到地。当栅极为低时,MOS 管断开,此时电机线圈内的电流继续通过续流二极管回流电机的正极。我们通过调节栅极控制端的PWM占空比,就可以控制电机的转速。
2. TIM模块
TIM 模块最重要的三个寄存器是:
Counter Register (TIMx_CNT) 计数寄存器
Auto-Reload Register (TIMx_ARR) 重置寄存器
Capture/compare mode register 1 (TIMx_CCMRx) 输入捕获/输出比较寄存器
Counter 在时钟的驱动下计数
Auto-Reload 设定计数的最大限制值
Capture/Compare 锁存一个事件发生时的计数值到Capture/计数达到 Compare 值后触发一个事件
在 PWM 模式下,Auto-Reload 寄存器设定PWM的周期,Compare 设定占空比。
有一点需要注意的是一个 TIM 模块只有一个计数器和一个重置寄存器,而有多个输入捕获/输出比较寄存器。所以一个 TIM 模块的多个通道可以设置不同的占空比,但周期都是相同的。
所以我们在选用 MCU 的时候,如果需要产生多种周期的 PWM,不仅要看它的定时器模块一共有多少通道数,还要看是否有足够的独立 TIM 模块。
3. 代码
我们在下面这个工程的基础上修改来实现用一个可调电阻控制PWM占空比,来控制电机的转速。
STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\TIM\TIM_PWMOutput\MDK-ARM\Project.uvprojx
这个工程默认使用TIM3模块输出4路PWM,我们可以只保留其中一路。
然后把ADC采样的代码添加进来:
Step 1:
stm32f0xx_hal_conf.h
#define HAL_ADC_MODULE_ENABLED
Step 2:
main.h
添加ADC相关宏定义
Step 3:
stm32f0xx_hal_msp.c
添加ADC使用的引脚的初始化代码
Step 4:
把ADC的驱动文件添加进工程,在主程序初始化ADC。
Step 5:
读取 ADC 的值,写入 TIM 的 CCR 寄存器,观察 PWM 占空比的变化。根据电机的特性,还可能需要改变 PWM 的周期。
如果需要参考代码,可以在 Github 搜索 TopSemic 找到。
参考资料:
PM0215 STM32F0xxx Cortex-M0 programming manual
UM1785 Description of STM32F0 HAL and low-layer drivers
STM32F030 Datasheet
STM32F030 Reference Manual
相关问答
单片机 是怎么通过 pwm 波来控制电机运转的,工作原理是什么?PWM的英文全称是PulseWidthModulation的缩写,翻译成中文就是脉冲宽度调制,PWM是一种利用数字输出来对模拟电路进行控制的技术,它的实质就是使用数字信号...
单片机 有多少 PWM 输出的引脚 - Sz 的回答 - 懂得PWM功能,不同单片机有所不同。一般指的PWM是指单片机包含硬件PWM模块,不需要软件模拟,可实现稳定、高速的PWM占空比输出,且不占用太多软件资源。部...
单片机 产生 pwm 的方法?在单片机中生成脉宽调制(PWM)信号的方法可以根据具体的单片机型号和架构而异,但是通常有几种常见的实现方法。以下是其中两种较为常见的单片机产生PWM信号的方...
stc15 单片机 输出 pwm 频率?不同的单片机是不同的,拿STC15系列单片机来说:PWM的频率=PCA时钟输入频率/256PCA的时钟源有以下几种:sysclk,sysclk/2,sysclk/4,sysclk/6,sysclk/8...
PWM 信号一般可由 单片机 产生。对还是错?这是一个用单片机用定时器编程的PWM仿真实例,有虚拟示波器显示波形,可以看看。手机用浏览器可见。这是一个用单片机用定时器编程的PWM仿真实例,有虚...
单片机 产生 pwm 控制阀门,帮我看看硬件电路原理?1和8脚之间电位器R17,用于调零2脚与电阻R15、R16构成负反馈,控制放大倍数VALVE2=(1+R16/R15)Vin3脚信号输入,两个电容高频滤波1和8脚之间电位器R17,用于调...
单片机 输出的8位 pwm 波形是什么样子?8位是什么意思?是指,输出波形的分辨率,即输出方波的周期固定的等分成256份,脉宽(高电平时间)是可以在0-255之内变化的,即占空比为0-100%之间变化。如我们通常说的方波,...
想用 单片机 输出的 PWM 直接驱动mosfet管,需要加光耦隔离吗?应该要的,一般光耦驱动电流很小50mAMAX.如果你的驱动频率很高,因为S-D极电容比较大,电流小,一下子充不满,达不到驱动的电压的。所以一般要采用电流比较大...
单片机PWM 程序是肿么编写的啊,能给一个简单的例子吗?-ZOL问答有PWM功能的单片机入STC12系列单片机,直接给专用寄存器赋值开启相应定时器就可以了。普通单单片机,PWM需要用自己来调配。比如:#include
1、单片机的数字端口是指该端口只有通常的逻辑电平只有高电平或者低电平,用数字来表示高电平就是1,低电平就是0。以51单片机为例,如果说IO口P1.0为高电平,...