搜索
bottom↓
回复: 0

《DNK210使用指南 -SDK版 V1.0》第十二章 PWM输出实验

[复制链接]

出0入234汤圆

发表于 6 天前 | 显示全部楼层 |阅读模式
2.jpg
1)实验平台:正点原子DNK210开发板
2)购买链接:https://detail.tmall.com/item.htm?id=782801398750
3)全套实验源码+手册+视频下载地址:http://openedv.com/thread-348335-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学DNK210快速入门视频教程:https://www.bilibili.com/video/BV1kD421G7fu
6)正点原子FPGA交流群:132780729
1.png
3.png

第十二章 PWM输出实验


       本章将介绍Kendryte K210的PWM外设使用。通过本章的学习,读者将学习到SDK编程技术控制Kendryte K210的输出PWM波。
       本章分为如下几个小节:
       12.1 PWM介绍
       12.2 硬件设计
       12.3 程序设计
       12.4 运行验证

       12.1 PWM介绍
       PWM用于控制脉冲输出的占空比。Kendryte K210的PWM定时器模块可配置以下功能:
       1. 通过指定PWM定时器频率或周期来控制事件发生的频率
       2. 配置特定PWM定时器与其他PWM定时器或模块同步
       3. 使PWM定时器与其他PWM定时器或模块同相
       4. 设置定时器计数模式:递增,递减,或递增递减循环计数模式
       5. 使用预分频器更改PWM定时器时钟(PT_clk)的速率。每个定时器都有自己的预分频器,通过寄存器PWM_TIMER0_CFG0_REG的PWM_TIMERx_PRESCALE配置。PWM定时器根据该寄存器的设置以较慢的速度递增或递减
       PWM本质是一个定时器,Kendryte K210芯片的硬件定时器共有三个,每个硬件定时器均可设置PWM输出功能,且每个硬件定时器有四路通道,所以Kendryte K210芯片可以同时产生12路的PWM。需要注意的是,定时器如果设置了PWM输出功能,就不可以使用定时的功能,所以注意设置 PWM 号与通道时不要与TIMER定时器冲突。
       Kendryte K210官方SDK提供了3个操作PWM的函数,这些函数介绍如下:

       1,pwm_init函数
       该函数主要用于定时器时钟使能,如下代码所示:
  1. void pwm_init(pwm_device_number_t pwm_number)
  2. {
  3.     sysctl_clock_enable(SYSCTL_CLOCK_TIMER0 + pwm_number);
  4. }

  5. /* pwm_init定时器选项pwm_number的配置参数 */
  6. typedef enum _pwm_device_number
  7. {
  8.     PWM_DEVICE_0,
  9.     PWM_DEVICE_1,
  10.     PWM_DEVICE_2,
  11.     PWM_DEVICE_MAX,
  12. } pwm_device_number_t;
复制代码

       2,gpio_set_drive_mode函数
       该函数用于使能定时器,控制定时器的启动和关闭,如下代码所示:
  1. void pwm_set_enable(pwm_device_number_t pwm_number, pwm_channel_number_t channel, int enable);

  2. /* pwm_set_enable通道选项 channel的配置参数 */
  3. typedef enum _pwm_channel_number
  4. {
  5.     PWM_CHANNEL_0,
  6.     PWM_CHANNEL_1,
  7.     PWM_CHANNEL_2,
  8.     PWM_CHANNEL_3,
  9.     PWM_CHANNEL_MAX,
  10. } pwm_channel_number_t;
复制代码
       第一个参数选择定时器,有三个定时器可以选择,第二个参数用于选择开启的通道,该参数下共有4个成员变量可选择,所以一共可开启12路PWM,第三个参数是设置是否开启定时器,0:禁用,1:使能,该函数无返回值。

       3,pwm_set_frequency函数
       该函数用来设置PWM的输出频率和占空比,该函数原型及参数描述如下所示:
  1. double pwm_set_frequency(pwm_device_number_t pwm_number, pwm_channel_number_t channel, double frequency, double duty);
复制代码
       下面我们讲解下这个函数的后面两个参数,frequency是配置PWM输出的频率,duty用于配置PWM的占空比。该函数无返回值。

       12.2 硬件设计

       12.2.1 例程功能
       1.使用定时器1通道0,并将定时器1的输出通道1与红色LED灯引脚IO24绑定
       2. 按下KEY0按键后减少PWM输出PWM的占空比
       3. 按下KEY1按键后增加PWM输出PWM的占空比

       12.2.2 硬件资源

       1. 双色LED
              LEDR - IO24

       2. 独立按键
              KEY0按键 - IO18
              KEY1按键 - IO19

       12.2.3 原理图
       本章实验内容,主要讲解PWM外设的使用,无需关注原理图。

       12.3 程序设计

       12.3.1 PWM驱动代码
       定时器中断驱动源码包括两个文件:pwm.c和pwm.h,我们先介绍pwm.h文件的内容。

  1. /* 硬件IO口,与原理图对应 */
  2. #define PIN_PWM_LED             (24)
复制代码
       这里宏定义了红色LED灯的硬件引脚编号,因为和LED的驱动文件使用的外设不同,所以在这里重新定义了一个宏。下面我们看其源代码内容。
  1. void pwm1_init(double fre, double duty)
  2. {
  3.     /* 系统中断初始化 */
  4.     plic_init();
  5.     sysctl_enable_irq();
  6.     /* 初始化PWM */
  7.     pwm_init(PWM_DEVICE_1);
  8.     /* 设置PWM频率为200KHZ,占空比为0.5的方波 */
  9. pwm_set_frequency(PWM_DEVICE_1, PWM_CHANNEL_0, fre, duty);
  10.         /* 定时器1输出1(通道0)与红色LED灯引脚绑定 */
  11.     fpioa_set_function(PIN_PWM_LED, FUNC_TIMER1_TOGGLE1);
  12.     /* 使能 PWM 输出 */
  13.     pwm_set_enable(PWM_DEVICE_1, PWM_CHANNEL_0, 1);
  14. }
复制代码
       pwm.c文件只有一个PWM初始化函数pwm1_init,该函数有两个参数fre和duty,通过这两个参数可以在初始化的时候设置不同的PWM输出频率和占空比,接着我们看PWM的初始化过程,首先我们要开启系统中断并使能,然后初始化PWM1(对应定时器1),接着设置PWM输出频率和占空比,占空比的范围0%~100%,我们参数duty设置0~1即可,我们要将PWM输出到对应的硬件引脚,所以要将功能编号和引脚号绑定,最后使能PWM输出,红色LED灯引脚就能输出不同占空比的方波了。

       12.3.2 main.c代码
       main.c中的代码如下所示:
  1. int main(void)
  2. {
  3.     uint8_t key;
  4.     static double duty_cycle = 0.5;

  5.     key_init();                    /* 按键初始化 */
  6.     pwm1_init(200000, duty_cycle); /* 初始化PWM */

  7.     while(1)
  8.     {
  9.         key = key_scan(0);         /* 得到键值 */
  10.         if (key == KEY0_PRES)
  11.         {
  12.             duty_cycle -= 0.1;
  13.             if (duty_cycle < 0.0)
  14.             {
  15.                 duty_cycle = 0.0;
  16.             }
  17.             /* 传入cycle的不同值,调节PWM的占用比,也就是调节灯的亮度 */
  18.             pwm_set_frequency(PWM_DEVICE_1, PWM_CHANNEL_0, 200000, duty_cycle);
  19.         }
  20.         else if(key == KEY1_PRES)
  21.         {
  22.             duty_cycle += 0.1;
  23.             if(duty_cycle > 1.0)
  24.             {
  25.                 duty_cycle = 1.0;
  26.             }
  27.             /* 传入cycle的不同值,调节PWM的占用比,也就是调节灯的亮度 */
  28.             pwm_set_frequency(PWM_DEVICE_1, PWM_CHANNEL_0, 200000, duty_cycle);
  29.         }
  30.         else msleep(10);
  31.     }
  32. }
复制代码
       可以看到,我们创建了一个变量duty_cycle并设置为0.5,然后初始化使用到独立按键,接着进行PWM的初始化,我们初始化PWM的频率设置为200000,占空比设置为0.5,初始化完成后红色LED灯对应的引脚就能输出频率为200000Hz、占空比50%的方波了。
       最后就是在一个循环中读取按键的状态,当读取到KEY0按键被按下,则减少PWM输出的占空比,具体应表现为红色LED的亮度增加,当读取到KEY1按键被按下,则增加PWM输出的占空比,具体应表现为红色LED的亮度减小。

       12.4 运行验证
       将DNK210开发板连接到电脑主机,通过VSCode将固件烧录到开发板中,此时,便可看到红色LED处于半亮状态(理论状态),若按下KEY0按键,则可以看到红色LED的亮度增加,这是因为PWM输出的占空比减小导致的,若按下KEY1按键,则可以看到红色LED的亮度减小,这是因为PWM输出的占空比增加导致的。

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-17 02:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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