本帖最后由 nos001 于 2016-9-11 16:03 编辑
这个边沿捕捉是用来测算交流波形周期时间的,用的是CCP3引脚,PIC24F16KL402的捕捉设置非常简单,就只有CCP3CON控制寄存器需要设置,电平变化相关的功能默认都是关闭的,所以不存在设置上的问题。只要将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脚,过零加测电路采用交流悬浮衰减直入比较器翻转,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捕捉
- }
- }
复制代码
此帖出自
小平头技术问答
直接把小数放大成整数,然后进行相乘,然后缩小,这样处理完全能满足常用的数字处理。
不需要你这么复杂。
对了,如果只是实现乘法运算,是没有必要用MODESIM仿真哦,问题比较简单,实现也不难
!
谢谢,这个思路跟我所述差不多。我要做的是一个复矩阵求逆的模块,所以我想先保证每个模块的正确,所以想乘法也用MODERSIM反正下。
我还存在的问题是:
(1)因为我们要处理实数,即使我们在编功能模块的时候可以直接对输入进行移位放大,但是我们要仿真的话肯定要输入真实的实 数,但MODERSIM 却不能识别实数,这个该怎么处理。
(2)因为我最终是要实现MIMO系统的检测,所以还是要做定点处理的1+5+11,1是符号位,5是整数部分,11是小数,这样的话整个模块才能统一, 所以底层乘法模块也得这样,看起来可能复杂点,版主还有什么更好的办法请指教下哈。。。?
[ 本帖最后由 wang182004 于 2010-7-31 20:15 编辑 ]一周热门 更多>