PIC24系列单片机原理与开发 第十章.docx
- 文档编号:24159763
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:23
- 大小:31.42KB
PIC24系列单片机原理与开发 第十章.docx
《PIC24系列单片机原理与开发 第十章.docx》由会员分享,可在线阅读,更多相关《PIC24系列单片机原理与开发 第十章.docx(23页珍藏版)》请在冰豆网上搜索。
PIC24系列单片机原理与开发第十章
第10章输入捕捉、输出比较和PWM控制
10.1概述
PIC24F系列芯片集成了输入捕捉(InputCapture,IC)功能模块和输出比较(OutputComPare,OC)功能模块以及属于输出比较的脉宽调制器(PulseWidthModulator,PWM)。
这些功能模块是嵌入式测控应用中常用的外设,它们的共同点是都要使用定时器。
输入捕捉像一个“跑表”一样监测输入引脚,捕获输入引脚上事件的发生时刻,可精确地测量事件之间的时间。
常用于脉冲宽度、占空比、周期等参数的测量。
输出比较是将预先设定的值与定时器的计数器进行比较,一旦两者相等便在输出引脚上产生指定的逻辑电平,以实现对外部的控制。
PWM是输出比较的一种工作模式,用其可方便地实现脉冲宽度调制,可用于D/A变换等对外部模拟电路进行控制。
10.2输入捕捉
10.2.1输入捕捉的基本功能
输入捕捉属于定时器的应用功能,该功能用来检测外部输入信号发生事件的时刻。
当施加在具有输入捕捉功能引脚上的信号发生边沿跳变(一般可编程指定跳变是上升沿还是下降沿)时,用定时器捕捉到该特定的跳变沿时刻(定时器的计数值),并记录到相应的缓冲器中,同时可产生输入捕捉中断。
通过记录输入信号的的各跳变沿时刻,就可以用软件算出输入信号的周期和脉宽。
例如,对于图10-1所示的信号,利用单片机的输入捕捉功能,记录了信号4个跳变沿的时刻:
T1,T2,T3,T4。
显然,对于脉冲宽度测量,只要记录相邻两个不同极性跳变沿的时刻便可获得。
如T2-T1或T4-T3为正脉冲宽度,T3-T2为负脉冲宽度。
若要测量周期,利用捕捉的两个相邻两个同极性跳变沿的时刻便可获得信号的周期,如T3-T1或T4-T2。
输入捕捉的另一个用途是配合输出比较来延时。
例如,当需要在一个外部事件发生并延时一定时间后,产生一个输出信号来控制某种操作。
这时可利用输入捕捉来记录外部事件的发生时间,将此时间加上所需的延时值送输出比较寄存器,并允许输出比较功能,便可实现这种延时动作功能。
如晶闸管的移相触发,将电压过零同步信号作为输入捕捉信号,捕捉时间加上移相角对应的时间送输出比较寄存器,由其产生晶闸管的触发信号,这样就可实现移相触发功能。
根据PIC24系列芯片的型号不同,芯片集成有1~9个功能相同的输入捕捉通道,如PIC24FJxxGA006芯片的输入捕捉通道为5个。
各通道的工作是独立的,它们的结构和工作原理完全一样,并都拥有自己的控制/状态位和控制寄存器。
在下面的描述中用“x”(x=1,2,…)表示不同输入捕捉通道号、引脚、控制/状态位和寄存器名。
图10-2所示是PIC24的输入捕捉模块的简化框图。
捕捉缓冲器输入捕捉模块有多种工作模式,可通过控制寄存器ICxCON选择,在程序运行过程中,可用指令改变工作模式。
这些工作模式如下:
在ICx引脚上信号的每个下降沿捕捉定时器值。
在ICx引脚上信号的每个上升沿捕捉定时器值。
在ICx引脚上信号的每4个上升沿捕捉定时器值。
在ICx引脚上信号的每16个上升沿捕捉定时器值。
在ICx引脚上信号的每个上升沿和下降沿都捕捉定时器值。
输入捕捉模块有4级先进先出(FIFO)捕捉缓冲器,用于记录外部事件的发生时间(捕捉的定时器值)。
用户可以选择产生CPU中断的捕捉事件数。
CPU在休眠和空闲模式期间可被输入捕捉信号唤醒。
输入捕捉可以选择定时器TIMER2或TIMER3作为时基,定时器的时钟可以设置为指令时钟Fcy(系统时钟fosc/2)或是TxCK引脚上的外部时钟源。
定时器的设置详见“第5章定时器/计数器及编程”。
使能捕捉通道x不会自动设置ICx引脚方向。
因此,用户使用捕捉通道x时,必须将输入捕捉引脚ICx对应的I/O方向寄存器(TRISy)中的方向控制位配置成“1”,以确保ICx引脚为输入,同时还应禁止该输入引脚复用的其它外设功能。
10.2.2输入捕捉模块的寄存器
PIC24系列芯片的每个捕捉通道x都有自己的输入捕捉控制寄存器ICxCON和输入捕捉缓冲寄存器ICxBUF。
寄存器名称中的“x”代表捕捉通道的编号。
1.输入捕捉控制寄存器ICxCON
该寄存器主要负责模块x(输入捕捉通道x)的工作方式和操作控制。
表10-1所列为输入捕捉控制寄存器ICxCON的各位定义。
表10-1:
输入捕捉控制寄存器ICxCON各位功能定义(手册)
2.输入捕捉缓冲寄存器ICxBUF
每个捕捉通道都有一个16位宽度、深度为4级的先进先出(FIFO)捕捉缓冲区,用于存储捕捉事件发生时的定时器值,最多可连续存储4个捕捉值。
对用户而言,只能通过ICxBUF寄存器来访问捕捉缓冲区。
捕捉缓冲区中是否有数据(即非空),由控制寄存器ICxCON中的ICBNE(ICxCON<3>)位指示。
只要捕捉缓冲区中至少还有一个数据可读,ICBNE位保持为“1”,直到捕捉缓冲区中数据全部读出后ICBNE位才变成“0”。
若ICBNE(ICxCON<3>)位为“0”时读ICxBUF寄存器,将导致不可预知的结果。
当捕捉缓冲区中已有4个数据,之后又产生了一次捕捉,形成了第5个捕捉数据,这时会发生缓冲区溢出事件,使缓冲区溢出标志位ICOV(ICxCON<4>)置“1”,捕捉数据被自动丢弃,不送捕捉缓冲区,也就是说原存于捕捉缓冲区的4个数据依然可用。
须清除溢出标志ICOV方可恢复捕捉通道工作。
溢出标志ICOV为只读,无法用指令直接清零。
可以用以下方法清除溢出标志位ICOV(ICxCON<4>):
读ICxBUF寄存器,直到捕捉缓冲区为“空”(ICBNE(ICxCON<3>)=0)。
将ICM<2:
0>(ICxCON<2:
0>)置为000,关闭该捕捉通道,然后再重置ICM<2:
0>。
10.2.3简单捕捉事件
简单捕捉事件是指捕捉模式定义为在输入信号(ICx引脚上)的每个上升沿或下降沿捕捉定时器(TMR2或TMR3)计数值。
对应控制寄存器中的模式设置分别为ICM<2:
0>(ICxCON<2:
0>)=0b011或ICM<2:
0>(ICxCON<2:
0>)=0b010。
在这两种模式下,不使用捕捉模块的预分频器(预分频为1)。
输入捕捉逻辑电路根据所设置的捕捉模式自动监测ICx引脚上信号的上升沿/下降沿。
一旦如果出现了上升沿/下降沿,模块立即把当前定时器的计数值写入FIFO捕捉缓冲器,称之为发生了一次“捕捉事件”。
当发生的捕捉事件数与ICI<1:
0>(ICxCON<6:
5>)位域的设置值相等时,相应的输入捕捉中断标志位ICxIF置“1”。
注意,在写捕捉缓冲器后到ICxIF置“1”有两个指令周期的延迟。
若作为捕捉时基的定时器的分辨率(即定时器的计数脉冲周期)为指令周期,则从信号的沿变化到捕捉定时器的值也有1~2个指令周期的延迟,这是由于ICx上的边沿变化与指令时钟有一个同步时间,同时捕捉逻辑电路也有一定的延迟。
如果定时器的分辨率大于2个指令周期,则没有上述捕捉延迟现象。
10.2.4预分频器捕捉事件
这种模式是将的输入信号分频后再检测其上升沿进行捕捉。
分频系数只有两种:
4分频和16分频。
将控制寄存器中的ICM<2:
0>(ICxCON<2:
0>)设置成0b100时为4分频,捕捉模块对ICx引脚上的每4个上升沿作一次捕捉;位域ICM<2:
0>(ICxCON<2:
0>)设置成0b101时为16分频,捕捉模块对ICx引脚上的每16个上升沿作一次捕捉。
如果从分频后的信号来看,捕捉过程、中断标志位ICxIF的置“1”和可能产生的延迟现象等与上节的“简单捕捉事件”完全相同,在此不再重复。
10.2.5边沿检测模式
将位域ICM<2:
0>(ICxCON<2:
0>)设置成0b001时为边沿检测模式。
在这种模式下,捕捉模块在ICx引脚上输入信号的每个上升沿和每个下降沿均产生捕捉事件,将捕捉的定时器计数值送捕捉缓冲器。
在该模式下,控制寄存器中的中断模式位域ICI<1:
0>(ICxCON<6:
5>)不起作用。
ICx引脚上每个上升沿和每个下降沿处输入捕捉中断标志位ICxIF置“1”。
与“简单捕捉事件”一样,在写捕捉缓冲器后到ICxIF置“1”有两个指令周期的延迟。
定时器计数值的捕捉延迟现象也与“简单捕捉事件”相同。
10.2.6捕捉模式的切换
捕捉模块允许在运行中重新设置捕捉模式(即改写位域ICM<2:
0>(ICxCON<2:
0>))。
如果用户程序在运行中需切换捕捉模式,PIC24F手册建议用户在切换新的模式之前,先关闭捕捉模块(将ICM<2:
0>(ICxCON<2:
0>)清零),然后再设置新的模式。
这时因为捕捉模式改变时,预分频计数器不会清零,可能造成捕捉模式改变后的第一次捕捉从一个非零预分频比开始。
捕捉模块关闭时,预分频计数器被清零,捕捉缓冲器为空状态(位ICBNE(ICxCON<3>)为“0”)。
10.2.7输入捕捉的中断
根据用户对位域ICI<1:
0>(ICxCON<6:
5>)的设置,输入捕捉模块在若干次捕捉事件(“捕捉事件”定义为将捕捉的定时器值写入捕捉缓冲器中)后使中断标志位ICxIF置“1”。
若其允许中断控制位(ICxIE)为“1”且优先级(ICxIP)大于当前CPU的优先级,则CPU响应输入捕捉产生的中断。
如果位域ICI<1:
0>(ICxCON<6:
5>)的设置不等于0,则只要发生捕捉缓冲器溢出(溢出标志位ICOV(ICxCON<4>)为“1”),无论哪种模式的捕捉,中断标志位ICxIF均不会置“1”,即不产生捕捉中断。
但对于位域ICI<1:
0>=0b00的设置,不受此限制,仍可产生中断。
因此,输入捕捉通道还可以作为外部中断引脚使用,只要将位域ICI<1:
0>设置为0b00,则可使模块按用户所设置的捕捉模式(ICM<2:
0>)产生中断,与捕捉缓冲器的溢出标志位ICOV的状态无关,所选的定时器也可以作其它工作。
当捕捉缓冲器中的数据被读空或关闭模块时,中断计数将会复位。
这使中断计数可与FIFO状态重新同步。
每个输入捕捉通道x都有中断标志状态位ICxIF、中断允许位ICxIE)和中断优先级控制位域ICxIP<2:
0>。
PIC24FxxGA系列芯片有关输入捕捉中断的位(域)见表10-2,通道x的中断入口为_ICxInterrupt。
10.2.8输入捕捉的编程一般步骤和编程示例
相对来说,输入捕捉的编程比较简单,关键是正确设置捕捉通道x的控制寄存器和其相关的定时器。
编程的基本步骤如下:
(1)初始化ICxCON寄存器:
选择捕捉时基(Timer2/Timer3)、捕捉模式和每次中断的捕捉次数。
表10-2PIC24FxxGA系列芯片输入捕捉ICx与中断相关的标志位
中断源
中断号
中断标志位
中断允许位
中断优先级位域
IC1
1
IC1IF(IFS0<1>)
IC1IE(IEC0<1>)
IC1IP(IPC0<6:
4>)
IC2
5
IC2IF(IFS0<5>)
IC2IE(IEC0<5>)
IC2IP(IPC1<6:
4>)
IC3
37
IC3IF(IFS2<5>)
IC3IE(IEC2<5>)
IC3IP(IPC9<6:
4>)
IC4
38
IC4IF(IFS2<6>)
IC4IE(IEC2<6>)
IC4IP(IPC9<10:
8>)
IC5
39
IC5IF(IFS2<7>)
IC5IE(IEC2<7>)
IC5IP(IPC9<14:
12>)
(2)初始化捕捉定时器:
设置分辨率(时钟预分频系数)、时钟源、周期寄存器,启动定时器运行。
若定时器的时间范围不够,可用定时器的中断功能扩展定时器的计数位数(软件计数)。
注意,定时器的周期寄存器不能设为0,否则定时器不工作。
(3)中断参数初始化:
设置捕捉通道x的中断优先级ICxIP,中断标志位ICxIF清零、允许中断位ICxIE置“1”。
(4)捕捉通道x的ISR:
中断标志位ICxIF清零,根据每次中断的捕捉次数(ICI<1:
0>)的设置,读取缓冲器中的数据;或者读到状态位ICBNE=0为止(缓冲器空)。
(5)运行中若要切换捕捉模式,先令ICM<2:
0>=0(关闭模块),然后再将ICM<2:
0>置成所需模式。
例10-1:
以下语句的功能是:
输入捕捉通道1(IC1引脚)的捕捉模式为每4个上升沿作
一次捕捉,定时器2作时基,每2次捕捉事件产生中断。
IFS0bits.IC1IF=0;//清捕捉通道1的中断标志
IFS0bits.IC1IE=1;//允许捕捉通道1中断
IC1CON=0;
IC1CON=0x00A4;//ICTMR=1:
Timer2,ICM=0b100:
每4个上升沿作一次捕捉,
//ICI=0b01:
每2次捕捉事件产生中断
//输入捕捉通道1的中断服务程序
unsignedintCapture1,Capture2;
voidattribute((interrupt))_IC1Interrupt(void)
{IFS0bits.IC1IF=0;//清捕捉通道1的中断标志
Capture1=IC1BUF;//读第1个捕捉数据
Capture2=IC1BUF;//读第2个捕捉数据
}
例10-2:
以下程序代码的功能是:
用输入捕捉功能,采用捕捉模式切换法,测量通道
1(IC1_RD8引脚)信号的周期和正脉冲宽度。
周期和脉宽均测量10次,循环进行。
设指令时
钟为16MHz。
作为一种调试手段,程序中代码自己在IC1_RD8引脚上产生模拟的脉冲信号,
无需加外部信号源到IC1_RD8引脚。
voidDelayms(intx);//延时x毫秒函数,需另编
unsignedcharIndex,cnt,Fun;
unsignedintX[2],Tx[10],Px[10];//Tx[9:
0]:
存周期值,Px[9:
0]:
存脉宽值。
intmain(void)
{
cnt=Fun=0;//Fun=0:
测周期,Fun=1测脉宽
SRbits.IPL=3;//CPU优先级为3
IPC0bits.IC1IP=5;//捕捉通道1优先级为5
TMR3=0;PR3=0xffff;//Timer3的计数器清零,周期寄存器=0xffff
T3CON=0x8010;//启动,TCS位=0:
内部时钟(Fcy=16MHz),8分频(0.5us)
IC1CON=0x00;//Timer3作捕捉定时器,模块关闭
IC1CONbits.ICM=3;IC1CONbits.ICI=1;//每个上沿捕捉,每2次捕捉产生中断
IFS0bits.IC1IF=0;IEC0bits.IC1IE=1;//允许捕捉通道1中断
//产生模拟调试信号的代码。
若测外部施加在IC1引脚的信号,应屏蔽下面代码
LATDbits.LATD8=0;TRISDbits.TRISD8=0;//IC1_RD8为输出.
while
(1)
{
LATDbits.LATD8=1;//产生正脉冲宽1ms,周期20ms的信号
Delayms
(1);
LATDbits.LATD8=0;
Delayms(19);
}
}
//=============IC1捕捉中断ISR==============
void__attribute__((__interrupt__,no_auto_psv))_IC1Interrupt(void)
{
IFS0bits.IC1IF=0;//清中断标志
if(Fun==0)//测周期
{
X[0]=IC1BUF;X[1]=IC1BUF;
Tx[Index++]=X[1]-X[0];//两次捕捉值之差为周期值
if(Index>=10)//模式切换成边沿捕捉测脉宽
{
IC1CONbits.ICM=0;//关闭模块
IC1CONbits.ICM=1;//设置成每个上下沿均捕捉
Index=0;cnt=1;Fun=1;X[0]=X[1];//准备测脉宽,上沿值送X[0]
}
}
else//测脉宽
{
X[cnt++]=IC1BUF;
if(cnt>1)
{
cnt=0;
Px[Index++]=X[1]-X[0];//下沿与上沿捕捉值之差为脉宽
if(Index>=10)//模式切换成简单模式测周
{
IC1CONbits.ICM=0;//关闭模块
IC1CONbits.ICM=3;//设置成每个上沿捕捉
Index=0;Fun=0;
}
}
}
}
10.2.9在CPU休眠和空闲模式下的输入捕捉操作
1.休眠模式
当CPU执行PWRSAV#0(C30中为Sleep();)时,芯片进入休眠(SLEEP)模式,系统时钟被冻结。
如果通道x的输入捕捉模式位域ICM<2:
0>设置为0b111,则通道x可以作为外部中断源。
若通道x的中断允许位(ICxIE)为“1”,则其ICx引脚的上升沿使芯片从休眠状态唤醒。
这种捕捉模式不使用定时器,因此也不会产生实际的捕捉。
在该模式下,如果使能了通道x的中断允许位,且其中断优先级大于CPU的优先级,将产生中断。
如果输入捕捉通道x被配置为除ICM<2:
0>=0b111以外的捕捉模式,则其ICx引脚的任何上升沿和下降沿都不能将芯片从休眠模式唤醒。
2.空闲模式
当CPU执行PWRSAV#1(C30中为Idle();)指令时,芯片进入空闲待机低功耗模式。
在待机模式下,系统时钟源保持工作,因此输入捕捉通道x也可以保持工作。
控制寄存器中的位ICSIDL(ICxCON<13>)用于选择在空闲模式下捕捉通道x是否继续工作。
如果ICSIDL=0,则该捕捉通道在空闲模式下继续工作,由位域ICM<2:
0>(ICxCON<2:
0>)定义的各种捕捉模式均可正常工作。
当然,与捕捉通道x关联的定时器也要设置成在空闲模式下继续工作。
当捕捉通道x产生捕捉事件且其中断允许位(ICxIE)为“1”时,芯片将从空闲模式唤醒,CPU恢复正常运行。
如果ICSIDL=1,则模块在空闲模式下将停止工作。
如果将输入捕捉模式配置为ICM<2:
0>=0b111,则输入捕捉引脚将仅作为外部中断引脚,其工作情况与休眠(SLEEP)模式完全相同。
10.3输出比较和PWM控制
10.3.1输出比较的基本功能
输出比较(OutputComPare,OC)也是定时器模块的的应用功能。
该功能是将预置在比较寄存器的值与定时器的计数值进行比较,一旦这两个值相等(称之为产生匹配),则在输出引脚上产生指定的动作(置“1”,清“0”或取反),同时还可以产生中断,以实现对外部电路进行实时控制。
图10-3示意了进行两次匹配的输出比较过程。
显然,只要调整预置值N1和N2,便可获得相位和脉宽可调的周期信号。
这种输出比较功能是由模块内部硬件实现的。
与使用延时法来得到所需输出的方法相比,输出比较模块的优势在于可以得到非常精确的输出时间间隔。
另外,由硬件实现的比较功能不受其它中断进程的影响,而且对用户程序没有额外的开销。
根据PIC24系列芯片的型号不同,芯片集成有1~9个功能相同的输出比较通道(模块),如PIC24FJxxGA006芯片的输出比较通道为5个。
各通道的工作是独立的,它们的结构和工作原理完全一样,并都拥有自己的控制/状态位和控制寄存器。
在下面的描述中用“x”(x=1,2,…)表示不同输出比较通道号、引脚、控制/状态位和寄存器名。
图10-4所示是PIC24系列芯片输出比较模块的简化框图。
图中,OCFA引脚控制OC1-OC4通道,OCFB引脚控制通道OC5-OC8。
输出比较模块有多种工作模式,可通过控制寄存器OCxCON选择,在程序运行过程中,可用指令改变工作模式。
这些工作模式如下:
单次比较匹配模式。
双次比较匹配模式(单输出脉冲模式,连续输出脉冲模式)
简单脉宽调制模式(带故障保护输入,不带故障保护输入)。
输出比较模块可以选择定时器TIMER2或TIMER3作为时基,定时器的时钟可以设置为指令时钟Fcy(系统时钟fosc/2)或是TxCK引脚上的外部时钟源。
定时器的设置详见“第5章定时器/计数器及编程”。
使能输出比较通道x将自动设置OCx引脚为模块的输出,它并不影响OCx对应的I/O方向寄存器(TRISy)中的方向控制位,OCx的输出状态也不影响其对应的I/O输出锁存器(LATy)。
如果要检查OCx引脚状态,可读OCx对应的PORTy寄存器。
当使能了具有故障保护输入模式时,模块不会自动地将故障保护输入引脚OCFA(OCFB)配置为输入,用户应将该引脚对应的I/O方向寄存器(TRISy)中的方向控制位配置成“1”,以确保OCFA(或OCFB)引脚为输入。
CPU在休眠和空闲模式期间可以被输出比较事件唤醒。
10.3.2输出比较寄存器
PIC24系列芯片的每个输出比较通道x都有自己的输出比较控制寄存器OCxCON、输出比较值寄存器OCxR和第二输出比较值寄存器OCxRS。
寄存器名称中的“x”代表捕捉通道的编号。
1.输出比较控制寄存器OCxCON
该寄存器主要负责模块x(输出比较通道x)的工作方式和操作控制。
表10-3所列为输出比较控制寄存器OCxCON的各位定义。
表10-3:
输出比较控制寄存器OCxCON各位功能定义(参考手册162页)
虽然允许在程序运行过程中改变输出比较的工作模式,但为了避免发生不可预知的情况,PIC24的数据手册建议用户在切换到新的模式之前,先关闭输出比较模块(将位域OCM<2:
0>清零),然后再设置新的模式。
2.输出比较值寄存器OCxR和OCxRS
OCxR是通道x的比较值寄存器,OCxRS是比较值辅助寄存器,也称之第二比较值寄存器。
它们均为可读写的16位寄存器,用于存储输出比较值。
复位时两寄存器的值为随机的。
OCxR寄存器用于所有的比较模式,OCxRS寄存器只用于双次比较和PWM模式。
10.3.3单次比较模式的工作过程
所谓单次比较模式是:
参与比较匹配只有OCxR寄存器。
单次比较模式的比较匹配事件产生过程如下:
写比较模式位域OCM<2:
0>,使通道x的输出引脚OCx变为OCM<2:
0>定义的初始状态;
当OCxR寄存器与时基TMRy(y=2或3)的值相等时,产生比较匹配事件,使通道x的输出引脚OCx由初始状态变成模式所指定的状态,相应的中断标志位OCxIF置“1”。
从产生比较匹配到输出引脚的变化有1个指令周期延迟,到中断标志位OCxIF置“1”有3个指令周期延迟。
比较匹配事件的产生不影响时基TMRy的运行。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC24系列单片机原理与开发 第十章 PIC24 系列 单片机 原理 开发 第十
![提示](https://static.bdocx.com/images/bang_tan.gif)