AT91-PWM应用
步骤1:
make menuconfig配置内核, 开启PWM输出功能.
- Device Drivers --->
- Misc devices --->
- <*>Atmel AT32/AT91 PWM support
- [*] LEDSupport --->
- <*> LED Support usingAtmel PWM outputs
步骤2:
修改arch/arm/mach-at91/board-sam9m10g45ek.c
- static struct gpio_ledek_pwm_led[] = {
- #ifdefined(CONFIG_LEDS_ATMEL_PWM) || defined(CONFIG_LEDS_ATMEL_PWM_MODULE)
- { /* "right" led, green, userled1, pwm1 */
- .name = "d7",
- .gpio = 1<< AT91_PWM1, /* is PWM channel number */
- .active_low = 1,
- .default_trigger = "none",
- },
- #endif
- };
----------------------------------------
修改.gpio成员指定PWM通道, AT91SAM9G45一共有四个PWM通道.
步骤3:
编译内核, 下载烧写. 如果一切顺利, 输入下列命令即可从PD31输出越100Hz的方波.
- echo 127 > /sys/class/leds/pd7/brightness
占空比为127/256 ≈ 49.6%
步骤4:
为了修改PWM输出频率, 我们现在分析下驱动源码.
打开驱动文件"drivers/leds/leds-atmel-pwm.c",找到pwmled_probe()函数, 重点关注下面几条语句
- tmp = 5;
- if (!led->active_low)
- tmp |= PWM_CPR_CPOL;
- pwm_channel_writel(&led->pwmc,PWM_CMR, tmp);
- /*
- * Pick a period so PWM cycles at 100+ Hz; anda multiplier
- * for scaling duty cycle: brightness * mult.
- */
- tmp = (led->pwmc.mck / (1 << 5))/ 100;
- tmp /= 255;
- led->mult = tmp;
- pwm_channel_writel(&led->pwmc,PWM_CDTY,
- led->cdev.brightness * 255);
- pwm_channel_writel(&led->pwmc,PWM_CPRD,
- 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, 有误差的哟请务必注意.
代码如下
- tmp = 2;
- if (!led->active_low)
- tmp |= PWM_CPR_CPOL;
- pwm_channel_writel(&led->pwmc,PWM_CMR, tmp);
- /*
- * Pick a period so PWM cycles at 100+ Hz; anda multiplier
- * for scaling duty cycle: brightness * mult.
- */
- tmp = (led->pwmc.mck / (1 << 2))/38000;
- tmp /= 255;
- led->mult = tmp;
- pwm_channel_writel(&led->pwmc,PWM_CDTY,
- led->cdev.brightness * 255);
- pwm_channel_writel(&led->pwmc,PWM_CPRD,
- LED_FULL * tmp);
AT91-PWM应用的更多相关文章
- STM32之PWM君
PWM..英语好的人估计又知道这三个大写字母代表哪三个英语单词了.小弟不才,就说中文意思好了:脉冲宽度调制,玩过飞思卡尔的人估计对PWM非常的不陌生吧.电机驱动需要PWM,控制舵机的转向需要PWM,总 ...
- [nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM
一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指 ...
- Windows on Device 项目实践 1 - PWM调光灯制作
在前一篇文章<Wintel物联网平台-Windows IoT新手入门指南>中,我们讲解了Windows on Device硬件准备和软件开发环境的搭建,以及Hello Blinky项目的演 ...
- 用Arduino剖析PWM脉宽调制
PWM(Pulse Width Modulation)简介 PWM,也就是脉冲宽度调制,用于将一段信号编码为脉冲信号,也就是方波信号.多用于在数字电路中驱动负载随时间变化的电子元件,如LED,电机等. ...
- Arduino学习经验(一)之解决舵机库和pwm输出冲突
一.前言 最近在公司学习Arduino uno ,用它实现小车超声波避障功能.实现的功能很简单,就是在小车前方挂一个超声波模块,当碰到障碍物时,会通过舵机进行摆头,判断两边的距离,进行左右转弯.但是碰 ...
- stm8s103 PWM
stm8s103 PWM的设置不难,但是很多人不注意选项字节这个问题,PWM是IO口的第二功能,要用ST Visual Programmer 修改选项字节. 只需要修改AFR0的功能就可以了
- 驱动实现led,pwm和中断基础知识
2015.4.8星期三 晴天 今天老师讲的内容是内核编写led和pwm驱动,实现花样灯和放歌的功能.理解应用和驱动的对接,最后自己实现了在放歌的时候根据歌曲的节奏亮灭一个小灯,应为两个独立的驱动都已经 ...
- STM32中的PWM的频率和占空比的设置
转于http://blog.csdn.net/liming0931/article/details/8491468 下面的这个是stm32的定时器逻辑图,上来有助于理解: TIM3的ARR寄存器和 ...
- xenomai for at91
http://www.at91.com/linux4sam/bin/view/Linux4SAM/RealTime#Xenomai
随机推荐
- OAF_文件系列2_实现OAF导出CSV格式文件ExportButton(案例)
20150727 Created By BaoXinjian
- vim 学习日志(4):多窗口使用技巧
原文地址: http://blog.csdn.net/devil_2009/article/details/7006113 vim多窗口使用技巧 1.打开多个窗口打开多个窗口的命令以下几个:横向切割窗 ...
- RNG vs EDG | SKT vs KTB [20160826]
G1 RNG:丽桑卓,古拉加斯,强行开团流. EDG:崔斯特,普朗克,伊莉斯游走,全球支援流,小规模团战能以多打少. G2 RNG:塔莉垭,纳尔,烬. EDG:雷克塞,艾克,劫,冲击后排. G3 RN ...
- C++使用VARIANT实现二维数组的操作
C++使用VARIANT实现二维数组的操作 VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short.long.double等,包括各类指针和数组.组件之 ...
- 纸上谈兵:图(graph)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 图(graph)是一种比较松散的数据结构.它有一些节点(vertice),在某些节 ...
- MVC 為頁面的list資料重新命名
function ReBookFileName() { $("#div_sortable").find("li[ ...
- 服务器响应头隐藏X-power-by
服务器响应头隐藏X-power-by 这个不是Apache或者Nginx输出的,而是由语言解析器或者应用程序框架输出的. 这个值的意义用于告知网站是用何种语言或框架编写的.例如: PHP标准输出是:X ...
- delphi TEdit设为下横线,类似填表格
delphi TEdit设为下横线,类似填表格效果,无需第三方控件就可以实现. 无须编写代码,只要设置一下控件属性 需要修改这些属性: BorderStyle改为bsNone BevelKind改为b ...
- jstl <c:forEach> 介绍
varStatus是<c:forEach>jstl循环标签的一个属性,varStatus属性.就拿varStatus="status"来说,事实上定义了一个status ...
- Mac系统默认MAWP配置
MAC系统是自带apache的,配置起来也很容易,但是本身是不支持php的需要手动开启一下,这里记录一下配置过程 1.apache配置文件在/etc/apache2/httpd.conf,把Docum ...