原创 【转帖】在WINCE下使用s3c2440(友善之臂)TOU1输出PWM

2011-9-7 20:16 1553 4 4 分类: MCU/ 嵌入式

友善的MINI2440开发板可以实现在LInux下使用TOU0输出PWM让蜂鸣器出声,但在WINCE就没有提供相应的程序。

我想在WINCE下用PWM来驱动一个小电机,这得输出PWM啊,没办法,自己搞吧参考了好几篇文章,历经磨难,终于从TOU1(GPB1)口输出了一个50%占空比的PWM波形。

查说明知道,要让s3c2440输出PWM,需要做以下工作,

0、设置GPB1口为TOU1,GPB1有三种模式,00 = Input, 01 = Output,10 = TOUT1, 11保留,把GPBCON第2位设成0,第三位设成1

1、设置预分频器PRESCALER,其值从0-255,我设置的是PRESCALER0,值是128,计数器0和计数器1口共用一个预分频器PRESCALER

2、设置分频器DIVIDER1,有四个值1/2,1/4,1/8,1/16,每个计数器有一个分频器

这样设置之后,计数脉冲频率就是 (PCLK*DIVIDER)/(PRESCALER+1),PCLK是多少?我也不清楚,说明书上有,还没仔细看

3、设置TCNTB1,这是个16位计数缓存寄存器,其值从0-65536(2的16次方),我设置的100新啦,置1。

6、设置TCON,没错,还是TCON,这次要把手动更新计数器选项关闭,也就是置0

好啦,到现在为止,已经输出占空比为50%的PWM波了,剩下的事就是更改TCMPB1的数值来调整占空比。

把我的代码放在下面,可能不规范,呵呵!

s2440IOP->rGPBCON = (s2440IOP->rGPBCON &~(3 << 2)) | (1<< 3); // GPB1 == TOUT.
s2440IOP->rGPBCON = (s2440IOP->rGPBCON &~(3 << 16)) | (1<< 16); // GPB8 == OUTPUT.
s2440PWM->rTCFG0 = (s2440PWM->rTCFG0 &~(255 << 0)) | (1<< 7); // Precaler1=128
s2440PWM->rTCFG1 = (s2440PWM->rTCFG1 &~(15 << 4)) | (1<< 4); // devider1=1/4
s2440PWM->rTCNTB1 = 100; 
s2440PWM->rTCMPB1 = 50; 
s2440PWM->rTCON = (s2440PWM->rTCON &~( 0xf<< 8)) | (0xb<< 8); // /interval, inv-off, update TCNTB1&TCMPB1, start timer 1
s2440PWM->rTCON = s2440PWM->rTCON &~( 2<< 8);      //clear manual update bit

50%占空比的波形我是用示波器测出来的,为了测这个波可费了劲了,因为这个示波器我并不熟悉,而且是个老示波器,经常接触不良,经过半小时的熟悉过程,终于把这个波形测出来了

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条