社区导航

 

搜索
查看: 132|回复: 0

[原创] 【 ST NUCLEO-G071RB测评】_03_呼吸灯实验

[复制链接]

14

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-1-9 15:45:45 | 显示全部楼层 |阅读模式
本帖最后由 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人眼就不会觉得闪烁了
               
占空比连续变化的PWM分析图.png

【实验代码】
  • 使用了上一个实验——LED实验的代码,并使用面向对象的方法对代码进行封装,封装如下:
  1. #include "stm32g0xx.h"                  // Device header

  2. void Led_Init(void)
  3. {
  4.         //使能GPIOA的时钟
  5.         RCC->IOPENR |= (1<<0);        
  6.         //设置PA5为输出模式
  7.         GPIOA->MODER &= ~(0x3<<10); //[11:10]清0
  8.         GPIOA->MODER |= (1<<10);        //[11:10]=01 设置PA5为输出模式
  9. }

  10. /*函数功能:开启LED灯*/
  11. void Led_On(void)
  12. {
  13.         GPIOA->ODR |= (1<<5);        //[5]=1 PA5输出高电平
  14. }

  15. /*函数功能:关闭LED灯*/
  16. void Led_Off(void)
  17. {
  18.         GPIOA->ODR &= ~(1<<5);        //[5]=0 PA5输出低电平
  19. }
复制代码

  • 实现呼吸灯逻辑,代码如下:
  1. int main(void)
  2. {
  3.         int i;
  4.         int cmp = 0;
  5.         int inc = 1;
  6.         Led_Init();
  7.         
  8.         while(1){
  9.                 /*输出1次PWM信号*/
  10.                 for (i = 0; i < 1000; i ++){
  11.                         if (i < cmp){
  12.                                 Led_On();
  13.                         }else{
  14.                                 Led_Off();
  15.                         }
  16.                 }
  17.                
  18.                 if (cmp >= 1000){
  19.                         inc = -1;
  20.                 }else if (cmp <= 0){
  21.                         inc = 1;
  22.                 }
  23.                 cmp += inc;
  24.         }
  25. }
复制代码





此帖出自stm32/stm8论坛


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-1-19 02:37 , Processed in 0.072600 second(s), 16 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表