2020|0

23

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【 ST NUCLEO-G071RB测评】_03_呼吸灯实验 [复制链接]

本帖最后由 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实验的代码,并使用面向对象的方法对代码进行封装,封装如下:
  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论坛
点赞 关注(1)
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表