社区导航

 

搜索
查看: 553|回复: 6

[原创] 【 ST NUCLEO-G071RB测评】_08_PWM定时器控制三色LED实验

[复制链接]

37

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-1-22 10:00 | 显示全部楼层 |阅读模式
本帖最后由 lvxinn2006 于 2019-1-22 17:15 编辑

本次活动测评开发板ST NUCLEO-G071RB由ST意法半导体提供,感谢意法半导体对EEWorld测评的支持!

【实验目的】
· 掌握PWM定时器的原理与使用
· 掌握PWM在控制LED亮度功能上的应用

【实验环境】
· NUCLEO-G071RB开发板
· 三色LED灯模块
· Keil MDK-ARM(Keil uVision 5.25.2.0)
· Keil.STM32G0xx_DFP.1.0.0.pack

【实验资料】
· NUCLEO-G071RB开发板原理图
· STM32G071x8/xB Data Sheet
· STM32G071芯片用户参考手册

【实验分析
1、电气连接关系
红色R LED        ——> PC9
绿色G LED        ——> PC8
蓝色B LED        ——> PC10
微信图片_20190122100504.jpg

2GPIO引脚配置
图片1.png
由上图可知,PC8PC9PC10三个引脚分别对应着TIM1_CH1TIM1_CH2TIM1_CH3,所以需要把三个引脚都配置成AF2模式。
所以需要把这三个引脚配置成响应的AF模式,即AF2

3、启用TIM1定时器
图片2.png
如图设置,可以通过配置[11]位启用TIM1的时钟。

4、配置定时器
高级控制定时器(TIM1)由一个可编程的预分频器驱动的16位自动重装计数器组成,可用于多种用途,包括测量输入的脉冲长度。输入信号的捕获,或输出波形(包括输出比较,PWM,死区插入互补的PWM)
脉冲长度和波形周期可以在几微秒内进行调制。通过设定定时器预分频器和RCC时钟控制器,可以将定时器的工作时钟周期控制在毫秒级别。高级控制定时器(TIM1)和通用定时器器是完全独立的,不共享任何资源。
高级控制定时器原理如下:
图片3.png
本实验主要使用该定时器产生PWM信号,通过控制PWM占空比,使用不同占空比的信号,驱动三个颜色的LED灯,以控制三个LED灯的亮度等级,就可以搭配出不同颜色。
在定时器输出PWM信号的应用中,最重要的寄存器有:
ARR                ——计数重载寄存器,决定了PWM的周期;
CCRx        ——比较匹配寄存器,决定了不同引脚的PWM占空比;
CNT                ——定时器计数器,定时器计数器可以自增或自减,变化的过程中,不断与CCRx进行比较,一旦CNT达到CCRx的值时,就可以驱动响应的输出引脚发生电平的反转。

关于PWM相关配置的描述如下:

图片4.png

实验代码
  1. #include "stm32g0xx.h"                  // Device header
  2. #include <stdlib.h>

  3. void mdelay(int ms)
  4. {
  5.         RCC->APBENR1 |= RCC_APBENR1_TIM6EN;        //使能TIM6
  6.         TIM6->PSC = SystemCoreClock / 1000 - 1;        //预分频 定时器时钟为1000Hz
  7.         TIM6->ARR = ms;        //周期数
  8.         TIM6->CR1 |= TIM_CR1_OPM;        //单次脉冲模式
  9.         TIM6->CR1 |= TIM_CR1_CEN;        //启动定时器
  10.         while(TIM6->CR1 & TIM_CR1_CEN);        //等待定时器结束
  11. }

  12. void rgb_init(void)
  13. {
  14.         /* 初始化IO引脚 */
  15.         RCC->IOPENR |= RCC_IOPENR_GPIOCEN;        //使能GPIOC
  16.         GPIOC->MODER &= ~(0x3F<<16);
  17.         GPIOC->MODER |= (0x2A<<16);        //设置PC8 9 10为AF模式
  18.         GPIOC->AFR[1] &= ~(0xFFF<<0);
  19.         GPIOC->AFR[1] |= (0x222<<0);//设置PC8 9 10为AF2
  20.         
  21.         /* 初始化定时器TIM1 */
  22.         RCC->APBENR2 |= RCC_APBENR2_TIM1EN;        //启用TIM1时钟
  23.         TIM1->CR1 = (1<<7);        //允许auto-reload
  24.         TIM1->CCMR1 = (0x6<<4) | (1<<3)
  25.                                 | (0x6<<12) | (1<<11); //设置CH1 CH2为PWM模式
  26.         TIM1->CCMR2 = (0x6<<4) | (1<<3);        //设置CH3为PWM模式
  27.         TIM1->CCER |= (1<<0) | (1<<4) | (1<<8); //使能CH1,2,3的输出功能
  28.         TIM1->BDTR |= (1<<15);        //使能定时器的主输出功能
  29.         TIM1->PSC = 99;        //分频值
  30.         TIM1->ARR = 255;        //计数最大值,决定PWM周期
  31.         TIM1->CNT = 0;        //重置定时器计数器
  32.         TIM1->CR1 |= (1<<0); //启动定时器
  33. }

  34. int main(void)
  35. {
  36.         int rgb;
  37.         rgb_init();
  38.         while(1){
  39.                 rgb = rand();
  40.                 TIM1->CCR1 = rgb&0xff;        //CH1比较值,决定CH1占空比
  41.                 TIM1->CCR2 = (rgb>>8)&0xff; //CH2比较值,决定CH2占空比
  42.                 TIM1->CCR3 = (rgb>>16)&0xff; //CH3比较值,决定CH3占空比
  43.                 mdelay(100);
  44.         }
  45. }
复制代码




【实验现象】
· 三色LED会不断的改变颜色
图片5.png 图片6.png 图片7.png 图片8.png 图片9.png



此内容由EEWORLD论坛网友lvxinn2006原创,如需转载或用于商业用途需征得作者同意并注明出处



来源:EEWorld stm32/stm8板块,转载请附上链接


回复

使用道具 举报

929

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-1-22 10:37 | 显示全部楼层
1、楼主使用寄存器操作值得赞一波,这样在评测中更能深入了解这块MCU
2、楼主为何不妨使用下cubemx?或者官方的库接口?

点评

评测芯片,从底层寄存器角度出发,才能看清与其他芯片的区别,如果寄存器没问题,再使用库函数会感觉简单很多。最重要的是,项目太小,几行代码实现的功能,细节自己把控。  详情 回复 发表于 2019-1-22 11:30


回复

使用道具 举报

37

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-1-22 11:30 | 显示全部楼层
RCSN 发表于 2019-1-22 10:37
1、楼主使用寄存器操作值得赞一波,这样在评测中更能深入了解这块MCU
2、楼主为何不妨使用下cubemx?或者 ...

评测芯片,从底层寄存器角度出发,才能看清与其他芯片的区别,如果寄存器没问题,再使用库函数会感觉简单很多。最重要的是,项目太小,几行代码实现的功能,细节自己把控。

点评

嗯,期待楼主的继续评测帖子  详情 回复 发表于 2019-1-22 13:19


回复

使用道具 举报

929

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-1-22 13:19 | 显示全部楼层
lvxinn2006 发表于 2019-1-22 11:30
评测芯片,从底层寄存器角度出发,才能看清与其他芯片的区别,如果寄存器没问题,再使用库函数会感觉简单 ...

嗯,期待楼主的继续评测帖子


回复

使用道具 举报

9424

TA的帖子

133

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2019-1-22 21:29 来自手机 | 显示全部楼层
颜色很好看。赞赞赞

点评

透过一层纸,看起来有点像不同颜色的月亮  详情 回复 发表于 2019-1-23 09:39


回复

使用道具 举报

37

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-1-23 09:39 | 显示全部楼层
okhxyyo 发表于 2019-1-22 21:29
颜色很好看。赞赞赞

透过一层纸,看起来有点像不同颜色的月亮

点评

嗯嗯嗯  详情 回复 发表于 2019-1-23 09:54


回复

使用道具 举报

9424

TA的帖子

133

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2019-1-23 09:54 | 显示全部楼层
lvxinn2006 发表于 2019-1-23 09:39
透过一层纸,看起来有点像不同颜色的月亮

嗯嗯嗯

玩板看这里:

http://bbs.eeworld.com.cn/elecplay.html

EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!



回复

使用道具 举报

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

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

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

GMT+8, 2019-9-21 21:07 , Processed in 0.229192 second(s), 17 queries , Gzip On, MemCache On.

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