步骤1:

make menuconfig配置内核, 开启PWM输出功能.

  1. Device Drivers --->
  2. Misc devices  --->
  3. <*>Atmel AT32/AT91 PWM support
  4. [*] LEDSupport  --->
  5. <*>   LED Support usingAtmel PWM outputs

步骤2:

修改arch/arm/mach-at91/board-sam9m10g45ek.c

  1. static struct gpio_ledek_pwm_led[] = {
  2. #ifdefined(CONFIG_LEDS_ATMEL_PWM) || defined(CONFIG_LEDS_ATMEL_PWM_MODULE)
  3. {  /* "right" led, green, userled1, pwm1 */
  4. .name           = "d7",
  5. .gpio           = 1<< AT91_PWM1,    /* is PWM channel number */
  6. .active_low     = 1,
  7. .default_trigger    = "none",
  8. },
  9. #endif
  10. };

----------------------------------------

修改.gpio成员指定PWM通道, AT91SAM9G45一共有四个PWM通道.

步骤3:

编译内核, 下载烧写. 如果一切顺利, 输入下列命令即可从PD31输出越100Hz的方波.

  1. echo 127 > /sys/class/leds/pd7/brightness

占空比为127/256 ≈ 49.6%

步骤4:

为了修改PWM输出频率, 我们现在分析下驱动源码.

打开驱动文件"drivers/leds/leds-atmel-pwm.c",找到pwmled_probe()函数, 重点关注下面几条语句

  1. tmp = 5;
  2. if (!led->active_low)
  3. tmp |= PWM_CPR_CPOL;
  4. pwm_channel_writel(&led->pwmc,PWM_CMR, tmp);
  5. /*
  6. * Pick a period so PWM cycles at 100+ Hz; anda multiplier
  7. * for scaling duty cycle:  brightness * mult.
  8. */
  9. tmp = (led->pwmc.mck / (1 << 5))/ 100;
  10. tmp /= 255;
  11. led->mult = tmp;
  12. pwm_channel_writel(&led->pwmc,PWM_CDTY,
  13. led->cdev.brightness * 255);
  14. pwm_channel_writel(&led->pwmc,PWM_CPRD,
  15. LED_FULL * tmp);

--------------------------------

a.led->pwmc.mck = 133333333, 外部总线时钟

b.标蓝部分设置的是PWM模块的时钟分频系数, 参照手册PWM_CMR设置得知tmp=5(二进制0101)为MCK/32

c.tmp = (led->pwmc.mck / (1 << 5))/ 100;

这里的100为将要设置的目标频率. 如果分频系数为5, 那么最大可达到的目标频率约为16kHz.

好的, 我们已经找到了这两个关键的设置点, 下面以设置PWM输出38kHz为例, 计算参数

CPRD= 总线时钟/分频系数/目标频率


由上表可以看出, 分频系数2的小数部分最小, 误差也最小, 为最优选择. 但最终的目标频率不是精确的38kHz, 有误差的哟请务必注意.

代码如下

  1. tmp = 2;
  2. if (!led->active_low)
  3. tmp |= PWM_CPR_CPOL;
  4. pwm_channel_writel(&led->pwmc,PWM_CMR, tmp);
  5. /*
  6. * Pick a period so PWM cycles at 100+ Hz; anda multiplier
  7. * for scaling duty cycle:  brightness * mult.
  8. */
  9. tmp = (led->pwmc.mck / (1 << 2))/38000;
  10. tmp /= 255;
  11. led->mult = tmp;
  12. pwm_channel_writel(&led->pwmc,PWM_CDTY,
  13. led->cdev.brightness * 255);
  14. pwm_channel_writel(&led->pwmc,PWM_CPRD,
  15. LED_FULL * tmp);

AT91-PWM应用的更多相关文章

  1. STM32之PWM君

    PWM..英语好的人估计又知道这三个大写字母代表哪三个英语单词了.小弟不才,就说中文意思好了:脉冲宽度调制,玩过飞思卡尔的人估计对PWM非常的不陌生吧.电机驱动需要PWM,控制舵机的转向需要PWM,总 ...

  2. [nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM

    一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指 ...

  3. Windows on Device 项目实践 1 - PWM调光灯制作

    在前一篇文章<Wintel物联网平台-Windows IoT新手入门指南>中,我们讲解了Windows on Device硬件准备和软件开发环境的搭建,以及Hello Blinky项目的演 ...

  4. 用Arduino剖析PWM脉宽调制

    PWM(Pulse Width Modulation)简介 PWM,也就是脉冲宽度调制,用于将一段信号编码为脉冲信号,也就是方波信号.多用于在数字电路中驱动负载随时间变化的电子元件,如LED,电机等. ...

  5. Arduino学习经验(一)之解决舵机库和pwm输出冲突

    一.前言 最近在公司学习Arduino uno ,用它实现小车超声波避障功能.实现的功能很简单,就是在小车前方挂一个超声波模块,当碰到障碍物时,会通过舵机进行摆头,判断两边的距离,进行左右转弯.但是碰 ...

  6. stm8s103 PWM

    stm8s103 PWM的设置不难,但是很多人不注意选项字节这个问题,PWM是IO口的第二功能,要用ST Visual Programmer 修改选项字节. 只需要修改AFR0的功能就可以了

  7. 驱动实现led,pwm和中断基础知识

    2015.4.8星期三 晴天 今天老师讲的内容是内核编写led和pwm驱动,实现花样灯和放歌的功能.理解应用和驱动的对接,最后自己实现了在放歌的时候根据歌曲的节奏亮灭一个小灯,应为两个独立的驱动都已经 ...

  8. STM32中的PWM的频率和占空比的设置

    转于http://blog.csdn.net/liming0931/article/details/8491468 下面的这个是stm32的定时器逻辑图,上来有助于理解:   TIM3的ARR寄存器和 ...

  9. xenomai for at91

    http://www.at91.com/linux4sam/bin/view/Linux4SAM/RealTime#Xenomai

随机推荐

  1. Python中利用LSTM模型进行时间序列预测分析

    时间序列模型 时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征.这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺 ...

  2. (转)原始图像数据和PDF中的图像数据

    比较原始图像数据和PDF中的图像数据,结果见表1.1.表1.1中各种“解码器”的解释见本文后续的“PDF支持的图像格式”部分,“PDF中的图像数据”各栏中的数据来自开源的PdfView.如果您有兴趣查 ...

  3. [IIS]IIS扫盲(四)

    IIS简易安装 义哥门户网   IIS(Internet Information Server,互联网信息服务)是一种Web(网页)服务组件,其中包括Web服务器.FTP服务器.NNTP服务器和SMT ...

  4. Unity3D 双摇杆 c# JoyStick 实现自己的双摇杆

    转载请声明: http://www.cnblogs.com/ADaii/p/3859520.html Untiy3D 官方摇杆脚本只能完成一个摇杆,要实现双摇杆比较费劲 现在我吧我废了一通宵的结果共享 ...

  5. MySQL-(Master-Slave)配置

    1.两台机器,安装好版本一致的MySQL 192.168.29.128 (master) MySQL-5.6.21 192.168.29.129 (slave) MySQL-5.6.21 2.配置ma ...

  6. Tomcat8.0.21登录时忘记用户名和密码

    大概是这学期开学没多久吧,4月份的时候,为了学习javaEE,装了Tomcat.过了这么久早就忘记用户名和密码了,所以无法进入Tomcat的管理界面.百度(其实我也很想用google)了一堆,几乎都是 ...

  7. IEEE浮点数表示法之出小数

    纯小数的表示方法-------------------------------------------------    下面再来讲如何将纯小数转化为十六进制.对于纯小数,比如0.0456,我们需要把 ...

  8. 修改安全策略组 -- windows

    1.新建安全策略组文件SAMTool.inf md C:\SAMLog & echo [Version] >C:\SAMLog\SAMTool.inf &echo signatu ...

  9. QlikView TEXT控件固定显示图片

    QlikView 的Text控件不仅可以用来展示文本也可以用来展示图片. 数据表 2个列,一个是 关联字段(Country),另外一个保存图片物理路径. TEXT控件固定显示图片 ,编辑控件表达式 = ...

  10. maven 打包 spring 项目

    在程序中使用到了springframework控件(主要是为了使用Mybatis-spring操作数据库,省事). 使用maven管理项目的构建,现在需要生成一个jar包,包含所有依赖的jar包,并可 ...