PIC24系列单片机原理与开发 第十章.docx

上传人:b****4 文档编号:24159763 上传时间:2023-05-24 格式:DOCX 页数:23 大小:31.42KB
下载 相关 举报
PIC24系列单片机原理与开发 第十章.docx_第1页
第1页 / 共23页
PIC24系列单片机原理与开发 第十章.docx_第2页
第2页 / 共23页
PIC24系列单片机原理与开发 第十章.docx_第3页
第3页 / 共23页
PIC24系列单片机原理与开发 第十章.docx_第4页
第4页 / 共23页
PIC24系列单片机原理与开发 第十章.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

PIC24系列单片机原理与开发 第十章.docx

《PIC24系列单片机原理与开发 第十章.docx》由会员分享,可在线阅读,更多相关《PIC24系列单片机原理与开发 第十章.docx(23页珍藏版)》请在冰豆网上搜索。

PIC24系列单片机原理与开发 第十章.docx

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的运行。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1