在Android红外遥控器项目中使用了输出比较OC1(PWM)模块来产生38KHz PWM脉冲,脉冲占空比与红外信号发射距离以及产品功耗有关。其中占空比越大,发射距离越远,功耗越大。红外载波的占空比一般在1/3左右。
3 天前 上传
下载附件 (40.61
KB)
图1:输出比较框图
将输出比较模块配置为PWM 操作,需要以下步骤:1. 将OCx输出配置为可用的外设引脚选择引脚之一。2. 计算所需的占空比并将计算结果装入 OCxR 寄存器。3. 计算所需的周期并将计算结果装入 OCxRS 寄存器。4. 选择当前的 OCx 作为同步源,方法是把 0x1F写入SYNCSEL<4:0>(OCxCON2<4:0>),把 0 写入OCTRIG (OCxCON2<7>)。5. 通过写 OCTSEL2<2:0> 位(OCxCON<12:10>)选择时钟源。6. 如果需要的话,允许定时器和输出比较模块中断。 使用 PWM故障引脚时需要输出比较中断。7. 通过 OCM<2:0> (OCxCON1<2:0>)位选择所需的PWM模式。8. 如果定时器被选为时钟源,请设置 TMRy 预分频值,并通过将 TON(TxCON<15>)位置 1 来使能时基。 我们选择RB13/RP13/AN11作为OC1输出管脚,未分频时钟T2作为时钟源。将OC1RS寄存器写入421, OC1R寄存器写入140,以产生占空比为1/3 38KHz PWM脉冲。1/(421*62.5ns)=38KHz。PWM1初始化函数void mInitPWM1(void) { _RP13R = 18 ; //红外发送,OC1的功能号为18,将OC1重映射到RB13/RP13/AN11 OC1CON1 = 0x0006 ; //使用Timer2,边沿对齐PWM模式 OC1CON2 = 0x001F ; // 选择OC1为同步源 OC1RS = 421 ; //周期421*62.5ns 38K Hz OC1R = 140 ; //占空比:100/421}定时器T2初始化void T2_On(void) { T2CON = 0x0000 ;//未分频 T2CONbits.TON = 1 ; }定时器T2停止void T2_Off(void) { T2CONbits.TON = 0 ; }
原帖地址:
http://www.nwtel.cn/thread-195-1-1.htmlPIC单片机中文资料:带专用定时器的输出比较-DS39723A_CNhttp://pan.baidu.com/share/link?shareid=148544&uk=3004090951