【 ST NUCLEO-G071RB测评】_03_呼吸灯实验
<div class='showpostmsg'> 本帖最后由 lvxinn2006 于 2019-1-11 08:54 编辑本次活动测评开发板ST NUCLEO-G071RB由ST意法半导体提供,感谢意法半导体对EEWorld测评的支持!https://www.stmcu.com.cn/Product/pro_detail/cat_code/STM32G0/family/81/sub_family/261/layout/product【实验目的】
[*]理解PWM的基本原理与作用
[*]掌握如何在程序中使用GPIO输出不同占空比的PWM信号
[*]理解呼吸灯的实现原理
【实验环境】
[*]NUCLEO-G071RB开发板
[*]Keil MDK-ARM(Keil uVision 5.25.2.0)
[*]Keil.STM32G0xx_DFP.1.0.0.pack
【实验资料】
[*]NUCLEO-G071RB开发板原理图
[*]STM32G071x8/xB Data Sheet
[*]STM32G071芯片用户参考手册
【实验现象】
[*]使灯LD4实现呼吸效果
【实验分析】
[*]PWM概述
脉冲宽度调制(Pulse Width Modulation,缩写为PWM)是一种对模拟信号电平进行数字编码的方法
通过对一系列脉冲的宽度进行调制,来等效的获得所需要的模拟信号波形(包括形状和幅值)
[*]名词解释
脉冲信号
也叫数字信号,用电压的通电和断电两种物理状态来表示0和1
脉冲宽度(T)
一个完整的高低电平跳变的脉冲循环所需要的时间
一个脉冲信号的持续时间,一般以秒为单位
周期
脉冲频率(f)
周期脉冲每秒出现的次数为频率
计算公式:f=1/T(单位Hz)
通电时间(t)
一个完整脉冲循环(信号周期)中通电状态保持的时间,一般以秒为单位
占空比(δ)
在一个完整脉冲循环(信号周期)内通电(高电平)时间所占的比例
通电时间占整个周期的比例
计算公式:δ=t/T
脉冲电压(a)
脉冲信号通电状态(高电平)时的电压值
等效模拟电压(A)
一个完整的PWM脉冲信号,可以等效于一个持续输入的模拟信号,这个等效的模拟信号的电压值。
计算公式:A=a×δ
[*]主要特征
通过改变PWM的占空比,可以调整输出不同的等效电压
只要带宽足够,任何模拟值都可以使用PWM进行编码
[*]改变LED的亮度
原理
单片机输出指定占空比的PWM信号驱动LED1,PWM频率要高于30Hz人眼就不会觉得闪烁了
【实验代码】
[*]使用了上一个实验——LED实验的代码,并使用面向对象的方法对代码进行封装,封装如下:
#include "stm32g0xx.h" // Device header
void Led_Init(void)
{
//使能GPIOA的时钟
RCC->IOPENR |= (1<<0);
//设置PA5为输出模式
GPIOA->MODER &= ~(0x3<<10); //清0
GPIOA->MODER |= (1<<10); //=01 设置PA5为输出模式
}
/*函数功能:开启LED灯*/
void Led_On(void)
{
GPIOA->ODR |= (1<<5); //=1 PA5输出高电平
}
/*函数功能:关闭LED灯*/
void Led_Off(void)
{
GPIOA->ODR &= ~(1<<5); //=0 PA5输出低电平
}
[*]实现呼吸灯逻辑,代码如下:
int main(void)
{
int i;
int cmp = 0;
int inc = 1;
Led_Init();
while(1){
/*输出1次PWM信号*/
for (i = 0; i < 1000; i ++){
if (i < cmp){
Led_On();
}else{
Led_Off();
}
}
if (cmp >= 1000){
inc = -1;
}else if (cmp <= 0){
inc = 1;
}
cmp += inc;
}
}
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页:
[1]