本帖最后由 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芯片用户参考手册
【实验现象】
【实验分析】
脉冲宽度调制(Pulse Width Modulation,缩写为PWM)是一种对模拟信号电平进行数字编码的方法
通过对一系列脉冲的宽度进行调制,来等效的获得所需要的模拟信号波形(包括形状和幅值)
脉冲信号
也叫数字信号,用电压的通电和断电两种物理状态来表示0和1
脉冲宽度(T)
一个完整的高低电平跳变的脉冲循环所需要的时间
一个脉冲信号的持续时间,一般以秒为单位
周期
脉冲频率(f)
周期脉冲每秒出现的次数为频率
计算公式:f=1/T(单位Hz)
通电时间(t)
一个完整脉冲循环(信号周期)中通电状态保持的时间,一般以秒为单位
占空比(δ)
在一个完整脉冲循环(信号周期)内通电(高电平)时间所占的比例
通电时间占整个周期的比例
计算公式:δ=t/T
脉冲电压(a)
脉冲信号通电状态(高电平)时的电压值
等效模拟电压(A)
一个完整的PWM脉冲信号,可以等效于一个持续输入的模拟信号,这个等效的模拟信号的电压值。
计算公式:A=a×δ
通过改变PWM的占空比,可以调整输出不同的等效电压
只要带宽足够,任何模拟值都可以使用PWM进行编码
原理
单片机输出指定占空比的PWM信号驱动LED1,PWM频率要高于30Hz人眼就不会觉得闪烁了
【实验代码】
- 使用了上一个实验——LED实验的代码,并使用面向对象的方法对代码进行封装,封装如下:
- #include "stm32g0xx.h" // Device header
- void Led_Init(void)
- {
- //使能GPIOA的时钟
- RCC->IOPENR |= (1<<0);
- //设置PA5为输出模式
- GPIOA->MODER &= ~(0x3<<10); //[11:10]清0
- GPIOA->MODER |= (1<<10); //[11:10]=01 设置PA5为输出模式
- }
- /*函数功能:开启LED灯*/
- void Led_On(void)
- {
- GPIOA->ODR |= (1<<5); //[5]=1 PA5输出高电平
- }
- /*函数功能:关闭LED灯*/
- void Led_Off(void)
- {
- GPIOA->ODR &= ~(1<<5); //[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;
- }
- }
复制代码