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

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

3天内不再提示

【GD32H757Z海棠派开发板使用手册】第六讲 TIMER_3路PWM输出实验

聚沃科技 2024-05-09 09:36 次阅读
wKgZomYgeJOAUiXJAB6mQrDJGEg027.png

6.1实验内容

通过本实验主要学习以下内容:

  • TIMER PWM输出原理
  • TIMER 定时中断

6.2实验原理

6.2.1IO口设置

本例程中,使用TIMER0输出前三个通道的占空比,这三个通道分别为PA8、PA9和PA10,从datasheet中我们可以看到这三个引脚的定义:

wKgZomY8J6SAXOV-AAER4tjVkD8367.png

所以需要将这三个引脚配置为AF模式并选择正确的AF号:

wKgaomY8J7GABdDPAANALBRWiD4253.png

6.2.2TIMER输出PWM原理

TIMER计数方式有两种:边沿计数和中央计数,其中边沿计数分为向上计数和向下计数。

在向上计数模式下,需要配置TIMER的重载值,当TIMER开始工作后,计数值从0开始递增,当达到重载值后计数值变为0重新开始计数;

向下计数模式和向上模式类似,只是计数值是递减的,减到0后从重载数重新计数;

中央对齐模式的计数模式为从0开始计递增到重载值,再从重载值递减到0,从“0到0”为一次计数周期。

在0和重载值之间,用户还可以设置一个比较值,PWM就是通过这个比较值来发出的,当计数值小于比较值时,IO口将会为高或者低,当计数值大于比较值时,IO将为输出为另一个电平,即低或高,当TIMER连续计数时,就呈现出PWM波形。比较值的大小将决定PWM的占空比。以下为TIMER输出PWM的示意图:

wKgZomY8J8SAGm6sAAEwKRlzOFk202.png

图中的OxCPRE为“输出极性”,为高时为有效电平,为低时是无效电平,用户可以设置通道口为有效电平时输出高电平或者输出低电平。比如,将PA8设置为高电平有效,那么当OxCPRE输出为高时,PA8输出高电平;如果设置PA8为低电平有效,那么当OxCPRE输出为高时,则PA8输出低电平。

本实验采用TIMER5进行定时中断,在中断中改变TIMER0前三个通道的占空比,使用示波器或逻辑分析仪,可以测量TIMER0前三个通道PA8、PA9和PA10的波形。也可以通过飞线的方式将三个IO口分别接到红绿蓝三种不同颜色灯珠上,实现RGB彩灯的效果。

6.3硬件设计

TIMER0的前三个通道分别为PA8、PA9和PA10,读者直接对开发板上引出的排针进行测试即可。

wKgaomY8J96AMy8IAAFI0SJPFzA923.png

6.4代码解析

本例程使用了两个TIMER,其中TIMER5用来产生30ms的周期性中断,在TIMER5的中断中,对TIMER0的三个通道占空比进行调整,从而实现占空比可变的效果。

6.4.1主函数代码解析

主函数代码如下所示,主要包括串口初始化、LED初始化、RGB灯珠初始化(即timer0的三个通道初始化)、timer驱动初始化(该timer用于调整RGB灯珠PWM驱动时间)。

C++
int main(void)
{
//延时和公共驱动部分初始化
driver_init();
//打印串口初始化
bsp_uart_init(&BOARD_UART);
//初始化LED组
bsp_led_group_init();
bsp_led_on(&LED2);
bsp_led_off(&LED1);
bsp_rgb_init(1000000,10);//
//注册rgb_switch函数到timer定时中断的回调函数
TIMER_INT.timer_updata_callback=rgb_switch;
//初始化定时器,默认计数器频率100K,周期值3000,中断频率100K/3000= 33HZ(30ms)
bsp_timer_init(1000000,100);//
printf_log("\r\n RGB breathing lamp\r\n");
while(1)
{

}
}

6.4.2RGB灯珠初始化函数解析

RGB灯珠初始化函数如下,在此定义了RGB_TIMER_R、RGB_TIMER_G、RGB_TIMER_B三个灯的控制结构体,并通过timer驱动进行配置。

C++
/* 定义注册RGB对应PWM通道 */
TIMER_CH_DEF(RGB_TIMER_R,TIMER0,0,TIMER_CH_PWM_LOW,A,8,AF_PP,GPIO_AF_1);
TIMER_CH_DEF(RGB_TIMER_G,TIMER0,1,TIMER_CH_PWM_LOW,A,9,AF_PP,GPIO_AF_1);
TIMER_CH_DEF(RGB_TIMER_B,TIMER0,2,TIMER_CH_PWM_LOW,A,10,AF_PP,GPIO_AF_1);

/*!
* 说明 RGB初始化
* 输入[1] counter_frequency 计数器频率
* 输入[2] period 周期值
* 返回值 无
*/
void bsp_rgb_init(uint32_t counter_frequency,uint16_t period)
{
driver_timer_multi_channel_init(&RGB_TIMER_R,&RGB_TIMER_G,&RGB_TIMER_B,NULL,counter_frequency,period);
driver_timer_pwm_on(&RGB_TIMER_R);
driver_timer_pwm_on(&RGB_TIMER_G);

6.4.3基础定时器初始化及中断处理函数

基础定时器初始化配置代码如下,在此用一个定时器TIMER5,并使能了其溢出中断。该定时器用于控制RGB PWM输出时间。

C
/* 注册定义定时器中断使用的timer */
TIMER_BASE_DEF(TIMER_INT,TIMER5);
/*!
* 说明 定时器中断初始化
* 输入[1] counter_frequency:计数器频率值
* 输入[2] period:周期值
* 返回值 无
*/
void bsp_timer_init(uint32_t counter_frequency,uint16_t period)
{
driver_timer_base_int_init(&TIMER_INT,counter_frequency,period);
nvic_irq_enable(TIMER5_DAC_UDR_IRQn,0,0);
}

其中断回调函数如下,通过该函数定时调整RGB三路PWM的占空比。

C
/*!
* 说明 定时器中断服务函数
* 输入[1] 无
* 返回值 无
*/
void TIMER5_DAC_UDR_IRQHandler(void)
{
driver_timer_updata_int_handler(&TIMER_INT);
}

/*!
* 说明 RGB占空比切换函数(TIMER定时中断回调)
* 输入 无
* 输出 无
* 返回值 无
*/
void rgb_switch(void)
{
static uint8_t r_duty=0,g_duty=0,b_duty=0;
//每轮中断依次调整rgb占空比,将全部组合遍历
bsp_rgb_duty_set(r_duty,g_duty,b_duty);
b_duty+=5;
if(b_duty>100)
{
b_duty=0;
g_duty+=5;
if(g_duty>100)
{
g_duty=0;
r_duty+=5;
if(r_duty>100)
{
r_duty=0;
bsp_led_toggle(&LED2);
bsp_led_toggle(&LED1);
}
}
}
}

6.5实验结果

将本例程代码下载到海棠派开发板中,使用示波器测量PA8、PA9、PA10上,可以看到三个通道输出PWM波,且占空比会周期性的变化。

教程GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网

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

    关注

    6008

    文章

    44062

    浏览量

    622631
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4923

    浏览量

    210354
  • Timer
    +关注

    关注

    1

    文章

    60

    浏览量

    12687
  • GD32
    +关注

    关注

    7

    文章

    351

    浏览量

    23785
收藏 人收藏

    评论

    相关推荐

    HJ-3G单片机实验使用手册.pdf

    HJ-3G单片机实验使用手册.pdf
    发表于 05-19 00:23

    这是DE2开发板使用手册

    DE2开发板使用手册,有兴趣的人可以下载看一下
    发表于 06-03 17:58

    QC-CPLD开发板快速使用手册

    `QC-CPLD开发板快速使用手册.pdf`
    发表于 10-06 08:11

    FPGA开发板快速使用手册

    QC-FPGA-C1开发板快速使用手册.pdf感兴趣的可以看看0
    发表于 10-07 09:24

    ARM7开发板FS4510使用手册

    [url=]ARM7开发板FS4510使用手册[/url][hide][/hide]
    发表于 12-30 10:02

    迅为iMX6ULL开发板使用手册资料下载

    第一部分 QT应用开发 第五篇 Linux系统移植篇 第六篇 Linux文件系统构建篇 《IMX6ULL终结者开发板裸机使用手册》第一章 Cortex-A7架构第二章 初识ARM汇编
    发表于 12-02 14:13

    YL-51开发板使用手册

    YL-51开发板使用手册,YL-51开发板使用手册YL-51开发板使用手册YL-51
    发表于 05-10 16:31 18次下载

    开发板烧写测试使用手册

    开发板烧写测试使用手册,有需要的下来看看
    发表于 06-03 14:30 0次下载

    51开发板使用手册

    51开发板使用手册,感兴趣的小伙伴们可以瞧一瞧。
    发表于 11-23 15:45 11次下载

    GD32H757Z海棠开发板使用手册】第一讲 GPIO-流水灯实验

    通过本实验主要学习以下内容: GPIO结构及原理; GPIO输出功能实现; LED驱动原理。
    的头像 发表于 04-16 11:39 188次阅读
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b>派<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第一讲 GPIO-流水灯<b class='flag-5'>实验</b>

    GD32H757Z海棠开发板使用手册】第二讲 GPIO-按键查询检测实验

    2.1实验内容通过本实验主要学习以下内容:GPIO输入功能原理;按键查询输入检测原理;2.2实验原理2.2.1GPIO输入功能原理GD32H7XX系列MCUGPIO输入配置结构如下图所
    的头像 发表于 04-17 10:42 245次阅读
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b>派<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第二讲 GPIO-按键查询检测<b class='flag-5'>实验</b>

    GD32H757Z海棠开发板使用手册】第五讲 PMU-低功耗实验

    PMU即电源管理单元,其内部结构下图所示,由该图可知,GD32H7XX系列MCU具有三个电源域,包括VDD/VDDA电源域、0.9V电源域以及电池备份域,其中,VDD /VDDA域由电源直接供电
    的头像 发表于 04-20 09:32 317次阅读
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b>派<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第五讲 PMU-低功耗<b class='flag-5'>实验</b>

    GD32F470紫藤派开发板使用手册第六TIMER_3PWM输出实验

    通过本实验主要学习以下内容: TIMER PWM输出原理 TIMER 定时中断
    的头像 发表于 05-08 09:20 159次阅读
    【<b class='flag-5'>GD</b>32F470紫藤派<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】<b class='flag-5'>第六</b>讲  <b class='flag-5'>TIMER_3</b>路<b class='flag-5'>PWM</b><b class='flag-5'>输出</b><b class='flag-5'>实验</b>

    GD32H757Z海棠开发板使用手册】第八讲 ADC-规则组多通道采样实验

    通过本实验主要学习以下内容: ADC的简介 GD32FH757 ADC工作原理 DMA和DMAMUX的原理 规则组多通道循环采样
    的头像 发表于 05-14 09:39 120次阅读
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b>派<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第八讲 ADC-规则组多通道采样<b class='flag-5'>实验</b>

    GD32H757Z海棠开发板使用手册】第九讲 USART-printf打印实验

    通过本实验主要学习以下内容: •串口简介 •GD32H757串口工作原理 •使用printf打印信息
    的头像 发表于 05-15 11:39 137次阅读
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b>派<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第九讲 USART-printf打印<b class='flag-5'>实验</b>