友善的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%占空比的波形我是用示波器测出来的,为了测这个波可费了劲了,因为这个示波器我并不熟悉,而且是个老示波器,经常接触不良,经过半小时的熟悉过程,终于把这个波形测出来了
文章评论(0条评论)
登录后参与讨论