STM32G0开发笔记:用PWM来实现LED呼吸灯效果

发布时间:2023-08-23  

使用Platformio平台的libopencm3开发框架来开发STM32G0,下面使用PWM来实现LED呼吸灯效果。


1 新建项目

在PIO主页新建项目pwm,框架选择libopencm3,开发板选择 MonkeyPi_STM32_G070RB;

新建完成后在src目录新建主程序文件main.c;

然后更改项目文件platformio.ini的烧写和调试方式:

1upload_protocol = cmsis-dap

2debug_tool = cmsis-dap

2 PWM配置

GPIO设置为复用PWM输出

1/**

 2 * @brief gpio config 

 3 * 

 4 */

 5static void gpio_setup(void)

 6{

 7    rcc_periph_clock_enable(RCC_GPIOC);

 8

 9    gpio_mode_setup(GPIOC,

10                    GPIO_MODE_AF,

11                    GPIO_PUPD_NONE,

12                    GPIO12);

13

14    gpio_set_output_options(GPIOC,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO12);

15

16    //TIM14_CH1 , AF2

17    gpio_set_af(GPIOC,GPIO_AF2,GPIO12);

18}


PWM配置

1/**

 2 * @brief pwm channel setup

 3 * 

 4 */

 5static void pwm_setup(void)

 6{

 7    rcc_periph_clock_enable(RCC_TIM14);

 8

 9    /* Timer global mode:

10     * - No divider

11     * - Alignment edge

12     * - Direction up

13     */

14    timer_set_mode(TIM14, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);

15

16    /*

17     * APB1 PRE = 1, TIMPCLK = PCLK

18     * APB1 PRE != 1, TIMPCLK = PCLK * 2

19     */

20    timer_set_prescaler(TIM14, (rcc_apb1_frequency/100000-1)); //100KHz

21

22    /* Disable preload. */

23    timer_disable_preload(TIM14);

24    timer_continuous_mode(TIM14);

25

26    /* Timer Period */

27    timer_set_period(TIM14, 20-1);  /* 100kHz /20 = 5 KHz */

28

29    /* Set the initual output compare value for OC1. */

30    timer_set_oc_mode(TIM14, TIM_OC1, TIM_OCM_PWM1);

31    timer_set_oc_value(TIM14, TIM_OC1, 20*0.3); //duty = 0.3

32

33    /* Enable output */

34    timer_enable_oc_output(TIM14, TIM_OC1);

35    timer_enable_counter(TIM14);

36}


先配置定时器的预分频和周期,这里设置到周期为5KHz,可以参考定时器章节的说明;



然后使用timer_set_oc_value 设置占空比,占空比根据定时器周期计算,比如这里设置为30%占空比;

3 呼吸灯效果

实现呼吸灯效果就是更改占空比,让其从0-100变化在从100-0变化即可;


1int duty = 0;

 2

 3while(1){

 4

 5        //from 0 - 100

 6        for(duty=0; duty <= 100; duty++){

 7            duty = duty + 1;

 8            timer_set_oc_value(TIM14,TIM_OC1, 20*duty/100);

 9

10            //delay some time

11            for(int i=0; i<600000; i++){

12                __asm__("nop");

13            }

14        }

15

16        //from 100-0

17        for(duty=100;duty>=0; duty--){

18            duty = duty - 1;

19            timer_set_oc_value(TIM14,TIM_OC1, 20*duty/100);

20

21            //delay some time

22            for(int i=0; i<600000; i++){

23                __asm__("nop");

24            }

25

26        }

27

28}


通过 timer_set_oc_value 改变输出占空比,然后延时一定时间即可达到呼吸灯的效果。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>