热度 12
2012-7-3 21:22
3201 次阅读|
4 个评论
28335 Ecap 使用总结 28335 Ecap 有好几个功能, 第一:捕获外部信号,可以设置为捕捉信号的上升还是下降沿,该功能一般最常用; 第二:计算外部方波信号的周期和占空比,在这里可以分别对 CAP1 、 CAP2 、 CAP3 和 CAP4 上升沿或下降沿动作进行设置,当外部信号和当前 CAPx 设置一致时,并将当前 CTR 值赋给 CAPx 寄存器。这样,可以根据四个 CAPx 寄存器里面的值,进行捕获的方波信号周期和占空比的计算。另外, CTR 的变化模式取决于 ECap6Regs.ECCTL1.bit.CTRRSTx 的设置,如果为‘ 0 ’,则动作匹配时,不复位 CTR ,将一直往上增加,直至溢出;如果为‘ 1 ’,则动作匹配时,复位 CTR 。 如果,一个程序当中,四个 CPAx 均用到的话,假如: CPA1 :上升沿 CPA2 :下降沿 CPA3 :上升沿 CPA4 :下降沿 对于输入信号,第一上升沿时, CPA1 动作,并且产生 CEVT1 事件(如果该事件中断使能的话,则可以进入中断),同时将 CTR 数加载到 CPA1 中;接下来,下降沿时, CPA2 动作,并且产生 CEVT2 事件(如果该事件中断使能的话,则可以进入中断),同时将 CTR 数加载到 CPA2 中;再接下来,上升沿时, CPA3 动作,并且产生 CEVT3 事件(如果该事件中断使能的话,则可以进入中断),同时将 CTR 数加载到 CPA3 中;再接下来,下降沿时, CPA4 动作,并且产生 CEVT4 事件(如果该事件中断使能的话,则可以进入中断),同时将 CTR 数加载到 CPA4 中;接下来在从 CPA1 往返动作。这时在一个循环里,可以利用四个 CAPx 里面的值进行周期和占空比的计算。 如果,程序不需要计算输入信号的周期和占空比,那么可能只要用到一个 CAPx ,这时就更简单了。(如下面觉得例子),这时 CTR 可以不运行( ECap6Regs.ECCTL2.bit.TSCTRSTOP = EC_FREEZE ), CAPx 寄存器加载也可以禁止( ECap6Regs.ECCTL1.bit.CAPLDEN = EC_DISABLE; )。 以上 2 个其实均为 CAP 口捕获功能,对应的 I/O 口为输入。 ECAP 口另外一个功能是产生 APWM ,和上述 2 个有很大的差别,对应的 I/O 口为输出。由于上面 2 个比较常用,特别是第一个,所以接下来,对设置 CAP 口为捕获功能的配置进行相关说明,以 Ecap 为例: 首先要设置 GPIO 引脚: EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // Enable pull-up on GPIO1 (CAP6) // GpioCtrlRegs.GPBPUD.bit.GPIO49 = 0; // Enable pull-up on GPIO49 (CAP6) // Inputs are synchronized to SYSCLKOUT by default. // Comment out other unwanted lines. GpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 0; // Synch to SYSCLKOUT GPIO1 (CAP6) // GpioCtrlRegs.GPBQSEL2.bit.GPIO49 = 0; // Synch to SYSCLKOUT GPIO49 (CAP6) GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 2; // Configure GPIO1 as CAP6 // GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 1; // Configure GPIO49 as CAP6 EDIS; Ecap6 的外部信号输入引脚,可以选择 GPIO1 或 .GPIO49 。 其次,功能寄存器设置: ECap6Regs.ECEINT.all = 0x0000; // Disable all capture interrupts ECap6Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags ECap6Regs.ECCTL1.bit.CAPLDEN = EC_DISABLE; // Disable CAP1-CAP4 register loads ECap6Regs.ECCTL2.bit.TSCTRSTOP = EC_FREEZE; // Make sure the counter is stopped // Configure peripheral registers ECap6Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE; //CAP mode ECap6Regs.ECCTL2.bit.CONT_ONESHT = EC_ONESHOT; // One-shot ECap6Regs.ECCTL2.bit.STOP_WRAP = EC_EVENT1; // Stop at 1 events ECap6Regs.ECCTL1.bit.CAP1POL = EC_FALLING; // Falling edge ECap6Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE; // Disable sync in ECap6Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;// Disable sync out signal ECap6Regs.ECCTL2.bit. REARM = 1; // Arm one-shot ECap6Regs.ECEINT.bit.CEVT1 = 1; // Enable 1 events interrupt 其中, ECap6Regs.ECCTL2.bit.REARM 这位决定 ECAP 口能否多次捕捉,外部信号的边沿。如果在中断响应函数里面没有“ ECap6Regs.ECCTL2.bit.REARM = 1; ”语句,则该 ECAP 口以后不响应信号边沿中断;如果为有“ ECap6Regs.ECCTL2.bit.REARM = 1; ”语句,则该 ECAP 口可以继续响应下一次中断。 ECAP 可以产生以下几个中断: 最后,外部 PIE 和 CPU 中断使能。 按照上述配置便可实现, ECAP 捕获外部信号的功能,该功能可以实现很多算法,常用的如锁相角跟踪算法等等。