0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

CHANBAEK ? 来源:电子技术攻城狮 ? 作者:MakerInChina.cn ? 2023-01-16 15:15 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

使用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%占空比;

  • 将程序烧写到开发板后可以测量引脚的输出PWM波形如下:

image-20220912105400109

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 改变输出占空比,然后延时一定时间即可达到呼吸灯的效果。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    242

    文章

    23875

    浏览量

    675426
  • PWM
    PWM
    +关注

    关注

    116

    文章

    5604

    浏览量

    219891
  • STM32
    +关注

    关注

    2295

    文章

    11034

    浏览量

    365933
  • 开发板
    +关注

    关注

    25

    文章

    5725

    浏览量

    105623
  • 呼吸灯
    +关注

    关注

    10

    文章

    112

    浏览量

    43396
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    PWM驱动LED实现呼吸效果

    C51 利用pwm 驱动LED 实现呼吸效果
    的头像 发表于 04-24 15:29 ?4728次阅读
    <b class='flag-5'>PWM</b>驱动<b class='flag-5'>LED</b><b class='flag-5'>实现</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b><b class='flag-5'>效果</b>

    使用PWM控制LED实现呼吸效果

    本文主要讲解使用PWM控制LED实现呼吸效果
    的头像 发表于 02-08 17:50 ?1.5w次阅读
    使用<b class='flag-5'>PWM</b>控制<b class='flag-5'>LED</b><b class='flag-5'>实现</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>的<b class='flag-5'>效果</b>

    STM32 使用PWM实现呼吸

    STM32 PWM实现呼吸使用STM32F103ZET6 定时器4 CH2通道产生
    发表于 12-24 19:41 ?55次下载
    <b class='flag-5'>STM32</b> 使用<b class='flag-5'>PWM</b><b class='flag-5'>实现</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>

    STM32G0开发笔记:FreeRTOS和FreeModbus库使用

    使用Platformio平台的libopencm3开发框架开发STM32G0,以下为FreeRTOS和FreeModbus库使用。
    的头像 发表于 01-16 14:44 ?7116次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:FreeRTOS和FreeModbus库使用

    STM32G0开发笔记:FreeRTOS和CLI组件使用

    使用Platformio平台的libopencm3开发框架开发STM32G0,以下为FreeRTOS和CLI组件使用。
    的头像 发表于 01-16 14:47 ?4637次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:FreeRTOS和CLI组件使用

    STM32G0开发笔记:使用FreeRTOS系统的队列Queue

    使用Platformio平台的libopencm3开发框架开发STM32G0,下面为使用FreeRTOS系统的队列Queue。
    的头像 发表于 01-16 14:50 ?1884次阅读

    STM32G0开发笔记:使用FreeRTOS系统

    使用Platformio平台的libopencm3开发框架开发STM32G0,下面为使用FreeRTOS系统。
    的头像 发表于 01-16 15:07 ?3091次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:使用FreeRTOS系统

    STM32G0开发笔记:使用ADC进行NTC温度采集

    使用Platformio平台的libopencm3开发框架开发STM32G0,以下使用ADC进行NTC温度采集。
    的头像 发表于 01-16 15:12 ?1.2w次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:使用ADC进行NTC温度采集

    STM32G0开发笔记:SD卡模块的使用方法

    使用Platformio平台的libopencm3开发框架开发STM32G0,下面介绍SD卡模块的使用方法。
    的头像 发表于 01-19 16:27 ?2894次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:SD卡模块的使用方法

    STM32G0开发笔记:SPI接口的基本使用

    使用Platformio平台的libopencm3开发框架开发STM32G0,下面介绍SPI接口的基本使用。
    的头像 发表于 01-17 10:38 ?3799次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:SPI接口的基本使用

    STM32G0开发笔记:多通道ADC与DMA的使用

    使用Platformio平台的libopencm3开发框架开发STM32G0,以下为多通道ADC与DMA的使用。
    的头像 发表于 01-17 10:41 ?8063次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:多通道ADC与DMA的使用

    STM32G0开发笔记:串口中断的使用

    使用Platformio平台的libopencm3开发框架开发STM32G0,以下为串口中断的使用。
    的头像 发表于 01-17 10:46 ?2920次阅读

    STM32G0开发笔记:GPIO接按键的使用方式

    使用Platformio平台的libopencm3开发框架开发STM32G0,下面为GPIO接按键的使用方式。
    的头像 发表于 01-17 10:48 ?2238次阅读

    STM32G0开发笔记LED示例

    使用Platformio平台的libopencm3开发框架开发STM32G0,下面为LED
    的头像 发表于 01-17 10:52 ?1854次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:<b class='flag-5'>LED</b><b class='flag-5'>灯</b>示例

    STM32G0开发笔记:使用libopencm3库

    使用Platformio平台的libopencm3开发框架开发STM32G0开发环境为VSCode+PIO插件,这里以
    的头像 发表于 01-17 10:56 ?2562次阅读
    <b class='flag-5'>STM32G0</b><b class='flag-5'>开发笔记</b>:使用libopencm3库