本帖最后由 ailingg 于 2016-9-11 17:56 编辑
这个边沿捕捉是用来测算交流波形周期时间的,用的是CCP3引脚,PIC24F16KL402的捕捉设置非常简单,就只有CCP3CON控制寄存器需要设置,电平变化相关的功能默认都是关闭的,所以不存在设置上的问题。只要将CCP3捕捉关闭就再也不会出现“非法操作码”复位,用示波器看过波形,边沿很陡峭光滑的,最近被p24F16KLxx搞的很抓狂。波形输入硬件电路如下:
CCP3相关代码
void CCP3_Init(void)
{
TRISAbits.TRISA7 = 1;
CCP3CONbits.CCPM = 4; //下降沿捕捉
CCPTMRS0bits.C3TSEL0 = 0;
IFS1bits.CCP3IF = 0;
IEC1bits.CCP3IE = 1;
g_SampleState = FREE;
g_CycleSampleFullMsg = 0;
g_ADC_BufInx = 0;
}
CCP3捕捉中断,改了下,让CCP3只在需要工作的时候使能,一下午没出现非法操作码复位了
/***************************************************************************************************************
* 模 块:过零捕捉
* 参 数:无
* 返 回:无
* 说 明:交流过零检测口在CCP3脚,过零加测电路采用交流悬浮衰减直入比较器翻转,2个下降沿之间的TMR1值就是波形周期时间。
* ADC1由T1定时比较触发转换,PR1取值决定采样点之间的间隔时间,PR1的取值计算:
* SAMPLE_POINTS = 32
* 波形周期 CycleTime = TMR1 * Tcy * 8
* 则有 PR1 = TMR1 * Tcy * 8 / Tcy / SAMPLE_POINTS = TMR1 * 8 / 32;
**************************************************************************************************************/
void __attribute__((interrupt, shadow,no_auto_psv)) _CCP3Interrupt(void)
{
static UINT8 IntoTimes = 0;
IFS1bits.CCP3IF = 0;
if ( IntoTimes == 0 ) // 第一个下降沿
{
IntoTimes = 1;
T1CONbits.TON = 0;
T1CONbits.TCKPS = 0b01; // 计算波形周期时,预分频1:8
PR1 = 65000;
TMR1 = 0;
T1CONbits.TON = 1;
}
else if ( IntoTimes == 1 ) // 第二个下降沿,根据所得波形周期和采样点数算出采样间隔,ADC采样转换开始
{
IntoTimes = 0;
T1CONbits.TON = 0;
T1CONbits.TCKPS = 0b00; // 计算ADC采样间隔时,预分频1:1
/* PR1 = CycleTime / SAMPLE_POINTS = TMR1 * Tcy * 8 / Tcy / SAMPLE_POINTS = TMR1 * 8 / 32 */
PR1 = TMR1 >> 2;
TMR1 = 0;
T1CONbits.TON = 1;
IEC0bits.AD1IE = 1;
AD1CON1bits.ADON = 1; // 打开AD模块
g_ADC_BufInx = 0; // 缓存清空
g_SampleState = BUSY;
IEC1bits.CCP3IE = 0;
CCP3CONbits.CCPM = 0; // 关闭CCP3捕捉
}
}
|