历史上的今天
今天是:2025年03月17日(星期一)
2020年03月17日 | PIC单片机输出比较(PWM)模块介绍
2020-03-17 来源:eefocus
在Android红外遥控器项目中使用了输出比较OC1(PWM)模块来产生38KHz PWM脉冲,脉冲占空比与红外信号发射距离以及产品功耗有关。其中占空比越大,发射距离越远,功耗越大。红外载波的占空比一般在1/3左右。
将输出比较模块配置为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 ;
}
下一篇:PICC——函数
史海拾趣
|
一、引言 过去工业控制计算机系统的软件功能都靠软件人员编程实现。工作量大,软件通用性差,且易产生错误。随着工业控制要求的不断提高,专门用于工业控制的组态软件应运而生,它是一套功能齐全的组态生成工具软件,通用性强,而 ...… 查看全部问答> |
|
_irqHandler PROC 1. STMFD sp!,{r0-r4,r12,lr} 2. mov r4,#0x80000000 //中断控制寄存器首地址(假设的) 3. ldr r0,[r4,#0] ...… 查看全部问答> |
|
最近在做sd卡驱动的移植,读手册时有几个参数看不明白。比如,我板子的sd卡控制器寄存器有两个位可以设置sd卡dma的类型,原文如下: DMA type: It indicates which DMA transaction type is used. These 2 bits are valid when the DMA_EN is e ...… 查看全部问答> |
|
首先我的程序在某些主板上是可以正常工作的(具体型号我也搞不懂),设置的是从设备,内部只有从设备状态机。没有接入奇偶检验,仲裁和热插拔。 问题是在一些主板上发现设置为从设备时无法找到设备,设置为主设备可以找到,但是通过软件读取配置信 ...… 查看全部问答> |
|
RAW_TASK.C具体教学问题1 raw_task_create教学问题: 1 代码是怎么实现系统只能创建一个 idle 任务的? 2 RAW_TASK_OBJ 结构体第一个成员task_stack 的地址等于结构体的地址吗? 3 RAW_TASK_OBJ 结构体成员中task_stack 为什么是放在第 ...… 查看全部问答> |
|
最近申请了一个省创项目,关于无线通信的战术动作命令腕表,不知带怎么开始,望大... 二、项目研究背景(可以是已有的基础,与本项目有关的研究积累和已取得的成绩,已具备的条件,尚缺少的条件及方法等) 随着社会的发展,人们身边的不安全因素越来越多。当人们处于特殊紧急环境,并且需要及时对威胁自己或他人的生命安 ...… 查看全部问答> |




