lvxinn2006 发表于 2019-1-22 10:00

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

<div class='showpostmsg'> 本帖最后由 lvxinn2006 于 2019-1-22 17:15 编辑

本次活动测评开发板ST NUCLEO-G071RB由ST意法半导体提供,感谢意法半导体对EEWorld测评的支持!https://www.stmcu.com.cn/Product/pro_detail/cat_code/STM32G0/family/81/sub_family/261/layout/product
【实验目的】· 掌握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
2、GPIO引脚配置 由上图可知,PC8、PC9、PC10三个引脚分别对应着TIM1_CH1、TIM1_CH2、TIM1_CH3,所以需要把三个引脚都配置成AF2模式。所以需要把这三个引脚配置成响应的AF模式,即AF2。
3、启用TIM1定时器 如图设置,可以通过配置位启用TIM1的时钟。
4、配置定时器高级控制定时器(TIM1)由一个可编程的预分频器驱动的16位自动重装计数器组成,可用于多种用途,包括测量输入的脉冲长度。输入信号的捕获,或输出波形(包括输出比较,PWM,死区插入互补的PWM)。脉冲长度和波形周期可以在几微秒内进行调制。通过设定定时器预分频器和RCC时钟控制器,可以将定时器的工作时钟周期控制在毫秒级别。高级控制定时器(TIM1)和通用定时器器是完全独立的,不共享任何资源。高级控制定时器原理如下: 本实验主要使用该定时器产生PWM信号,通过控制PWM占空比,使用不同占空比的信号,驱动三个颜色的LED灯,以控制三个LED灯的亮度等级,就可以搭配出不同颜色。在定时器输出PWM信号的应用中,最重要的寄存器有:ARR                ——计数重载寄存器,决定了PWM的周期;CCRx      ——比较匹配寄存器,决定了不同引脚的PWM占空比;CNT                ——定时器计数器,定时器计数器可以自增或自减,变化的过程中,不断与CCRx进行比较,一旦CNT达到CCRx的值时,就可以驱动响应的输出引脚发生电平的反转。
关于PWM相关配置的描述如下:

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

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

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

int main(void)
{
      int rgb;
      rgb_init();
      while(1){
                rgb = rand();
                TIM1->CCR1 = rgb&0xff;      //CH1比较值,决定CH1占空比
                TIM1->CCR2 = (rgb>>8)&0xff; //CH2比较值,决定CH2占空比
                TIM1->CCR3 = (rgb>>16)&0xff; //CH3比较值,决定CH3占空比
                mdelay(100);
      }
}



【实验现象】· 三色LED会不断的改变颜色


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



</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>

RCSN 发表于 2019-1-22 10:37

1、楼主使用寄存器操作值得赞一波,这样在评测中更能深入了解这块MCU
2、楼主为何不妨使用下cubemx?或者官方的库接口?

lvxinn2006 发表于 2019-1-22 11:30

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

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

RCSN 发表于 2019-1-22 13:19

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

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

okhxyyo 发表于 2019-1-22 21:29

颜色很好看。赞赞赞

lvxinn2006 发表于 2019-1-23 09:39

okhxyyo 发表于 2019-1-22 21:29
颜色很好看。赞赞赞

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

okhxyyo 发表于 2019-1-23 09:54

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

嗯嗯嗯
页: [1]
查看完整版本: 【 ST NUCLEO-G071RB测评】_08_PWM定时器控制三色LED实验