两个LED灯虽然可以闪了,但是总是需要CPU的参与。现在尝试使用一种更为自动化的方法:让脉宽调制(PWM)控制器输出具有一定周期和占空比的方波,以此控制LED灯的亮灭。

一、实现思路


依然使用蓝色和琥珀色的LED灯。开发板上能启用四个PWM通道,每个通道能输出两个互补的方波。我们会启用其中的一个通道,然后让这个通道的两个输出分别控制一个LED灯。但是由于这两个引脚上不存在同一通道的输出,所以需要第三个引脚辅助。
我们将使用PWM的通道0。
1.    PWMH0输出至引脚PA0(外设A)。
2.    PWML0输出至引脚PC0(外设B)。
3.    引脚PD20配置为纯输入引脚。
4.    将PC0和PD20两个引脚短接起来。
这样就可以使这两个LED灯交替闪烁了。

二、PWM设置

  1. 在PMC中启用PWM时钟。

    /* PMC 启用
    * PWM的ID大于31,需要在PMC_PCER1中启用
    */
    PMC->PMC_PCER1 = 1 << (ID_PWM - 32);
  2. 禁用PWM通道。
    通道在启用时不能进行完整的控制,先禁用通道。

    /* 禁用通道0,以进行配置 */
    PWM->PWM_DIS = PWM_DIS_CHID0;
  3. 设置时钟。
    通道选择的时钟直接或间接由主时钟分频得到。由于主时钟频率较高,所以为保证能产生肉眼可见的闪烁,这里会选择尽可能大的分频数。为对PWM的特性有更多的了解,我们将开启它的Clock A。
    通过向PWM时钟控制器的(PWM_CLK)中的PERA字段写入 9,以配置Clock A的输入时钟为MCK / 512;通过向DIVA字段写入125,再将输入时钟进行125分频。配置完成后,CLKA输出的时钟的频率即为MCK / (512 * 125)。初始化时,MCK的频率为4MHz(4000000Hz),所以CLKA输出频率即为62.5 Hz。

    /* clockA */;
    PWM->PWM_CLK = PWM_CLK_DIVA(125) | PWM_CLK_PREA(9);
  4. 选择通道的模式。
    为简单起见,将使用默认的属性:周期为左对齐,极性为先输出低电平,不使用中断以及死区发生器。同时,在这里为通道选择时钟CLKA。

    /* 配置通道0 */
    PWM->PWM_CH_NUM[0].PWM_CMR = PWM_CMR_CPRE_CLKA;
  5. 配置周期和占空比。
    为观察方便,将输出脉冲方波的周期设置为2秒,占空比50%。因为使用的时钟频率为62.5Hz,所以需要将计数器的周期设置为62.5 * 2 = 125。将比较器阀值设置为63,使占空比大约为50%。

    PWM->PWM_CH_NUM[0].PWM_CPRD = PWM_CPRD_CPRD(125);   /* 周期 */
    PWM->PWM_CH_NUM[0].PWM_CDTY = PWM_CDTY_CDTY(63);    /* 占空比,准确来说是阀值 */
  6. 使能PWM通道。

    /* 使能 PWM */
    PWM->PWM_ENA = PWM_ENA_CHID0;

三、PIO设置

在实现思路中已经说明了PIO引脚的配置,而且不是太为复杂,且后面将会给出完整代码,这里就不单独解释了。

附 完整代码

#include <sam.h>void ConfigPWM(void)
{/* PMC 启用* PWM的ID大于31,需要在PMC_PCER1中启用*/PMC->PMC_PCER1 = 1 << (ID_PWM - 32);/* 禁用通道0,以进行配置 */PWM->PWM_DIS = PWM_DIS_CHID0;/* clockA */;PWM->PWM_CLK = PWM_CLK_DIVA(125)| PWM_CLK_PREA(9);/* 配置通道0 */PWM->PWM_CH_NUM[0].PWM_CMR = PWM_CMR_CPRE_CLKA  /* 计数器时钟选择为CLKA */;                                 /* 周期左对齐,先输出低电平,不使用中断及死区发生器 */PWM->PWM_CH_NUM[0].PWM_CPRD = PWM_CPRD_CPRD(125);   /* 周期 */PWM->PWM_CH_NUM[0].PWM_CDTY = PWM_CDTY_CDTY(63);    /* 占空比,准确来说是阀值 *//* 使能 PWM */    PWM->PWM_ENA = PWM_ENA_CHID0;
}void ConfigPIO(void)
{/* 引脚由外设控制 */PIOA->PIO_PDR = PIO_PA0;PIOC->PIO_PDR = PIO_PC0;/* 选择外设 *//* PIOA选择外设A(将影响PA所有引脚) */PIOA->PIO_ABCDSR[0] = 0;PIOA->PIO_ABCDSR[1] = 0;/* PC0选择外设B */PIOC->PIO_ABCDSR[0] = PIO_ABCDSR_P0;PIOC->PIO_ABCDSR[1] = 0;/* 配置PD20为输入 */PIOD->PIO_PER = PIO_PD20;PIOD->PIO_ODR = PIO_PD20;
}int main(void)
{/* Disable WDT */WDT->WDT_MR = WDT_MR_WDDIS;ConfigPWM();ConfigPIO();while (1) {}return 0;
}

转载于:https://www.cnblogs.com/h46incon/p/3408600.html

SAM4E单片机之旅——4、LED闪烁之PWM相关推荐

  1. Proteus:单片机定时器中断(LED闪烁)

    题目概述: 单片机定时器中断(LED闪烁). 编程: #include <reg51.h> #define uchar unsigned char #define uint unsigne ...

  2. 单片机led闪烁代码_单片机、555实现LED闪烁电路

    有朋友在后台发消息,希望设计一个LED闪烁电路,闪烁频率为2Hz,想了解LED闪烁的电路原理是什么,下面解答一下,看看有没有写的很通俗易懂.要设计一个闪烁电路,闪烁频率为2Hz,即500ms亮灭交替. ...

  3. SAM4E单片机之旅——13、LCD之ASF初步

    在Atmel Studio 6中,集成了Atmel Software Framework(ASF框架).通过它提供的库,可以很快速地完成新的项目. 这次的最终目标使用ASF在LCD上显示出文字&quo ...

  4. 【单片机仿真项目】LED 闪烁灯(proteus原理图+keil代码)

    目录 1.keil代码 2.闪烁灯proteus电路仿真图 3.闪烁灯工作流程gif动态展示

  5. SAM4E单片机之旅——10、UART与MCK之PLL

    为使用更更高的波特率,则需要更更高的外设时钟的频率.这个时候就需要用到锁相环(PLL)了.锁相环可以对输入的时钟进行分频.升频后进行输出.MCK可以使用的锁相环为PLLA,而PLLA的输入时钟为MAI ...

  6. 控制led闪烁次数_单片机驱动LED灯的进阶之路

    对于大多数单片机的学习者或者是从事单片机行业的工程师来说,单片机驱动LED闪烁起来的时候,基本都是我们入坑的开始,同时当时的那种兴奋与喜悦都是难以忘怀的,从LED灯亮起,到闪烁,再到各种流水灯,能开心 ...

  7. WLGK-51单片机接口技术基础实验 —LED闪烁灯

    WLGK-51单片机接口技术基础实验--LED闪烁灯 当我们开始接触单片机,首先接触的第一个实验就是LED灯的使用,类似于我们学习软件开始接触的第一个程序"HelloWorld", ...

  8. WLGK-51单片机接口技术基础实验 ——LED闪烁灯

    WLGK-51单片机接口技术基础实验-LED闪烁灯 当我们开始接触单片机,首先接触的第一个实验就是LED灯的使用,类似于我们学习软件开始接触的第一个程序"HelloWorld",这 ...

  9. 十速单片机学习归纳总结(四):LED闪烁实验

    前言 通过前一篇文章的分享,我们已经成功搭建好了一个普适性的单片机框架,而这篇文章我们将开始编写第一个实验:LED闪烁实验. 代码的编写均在VSCode编辑器中进行:编写代码的文件为main.c文件和 ...

  10. STC15单片机-LED闪烁(面向对象程序结构)

    LED闪烁(面向对象程序结构) 将LED闪烁(延时等待)的程序修改为面向对象的程序结构,C语言面向对象主要由结构体和函数指针实现 以后也都采用这种程序设计方法 面向对象知识 面向对象是软件开发方法,是 ...

最新文章

  1. Python 关键字 global、nonlocal、yield用法
  2. IE6Bug,外层container设置了overflow:auto,但是内层嵌套元素有position:relative的时候,显示错误。...
  3. 12行代码AC——例题6-6 小球下落(Droppint Balls, UVa 679)——解题报告
  4. 《Programming WPF》翻译 第9章 6.我们进行到哪里了?
  5. php 批量更新死锁,php – 在尝试获取锁定时,哪个查询导致死锁;尝试重新启动事务...
  6. python 物理学中的应用_大学物理中Python的应用
  7. c# 拼凑特定格式的报表打印
  8. SpringBoot2.1.5 (5)---快速构建SpringBoot 项目的两种方式
  9. 没有聘礼,男友向我要一台奥迪汽车做陪嫁,房子是他婚前财产,正常吗?
  10. mcs51 串口通信 单片机发 pc收
  11. pygame游戏教程目录
  12. Masm 如何调试汇编代码
  13. 入行数据分析要知道什么是独立性检验拟合优度检验
  14. Java面试汇总+答案
  15. 软件测试类型之测试对象划分
  16. 集中式和分布式版本控制系统的区别
  17. pythonapi说明_python API接口说明
  18. Datawhale 智慧海洋建设-Task1 地理数据分析常用工具
  19. java服务器端开发-servlet:202、Servlet执行过程介绍:get请求与post请求、编码相关等
  20. 2013年7月我国网络不良与垃圾短信息分析报告

热门文章

  1. UAC2.0 Requests处理
  2. 慎重!物联网时代情趣用品真的适合联网么?
  3. 如何用PHP和JavaScript比较时期(包括时间)
  4. IE6下绝对定位层不显示
  5. openmeetings(开源视频会议系统)的详细安装步骤 (windows版)
  6. postfix疯狂外发垃圾邮件之分析与解决(下)
  7. SaaS应用出路何在?
  8. ASP.NET 主题和外观
  9. 04_使用域名访问后台管理系统(Nginx)
  10. 分享 Android 手机屏幕录制并制作成 GIF 演示图片