lvxinn2006 发表于 2019-1-9 15:45

【 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]
查看完整版本: 【 ST NUCLEO-G071RB测评】_03_呼吸灯实验