本帖最后由 harvardx 于 2016-7-18 00:10 编辑
新唐M051系列是非常出色的给力芯,用了很久, 做了很多产品, 一直觉得他是8位机的不错继任者, 于字面,我们通常认为是用来可以取代兼容8051的M0单片机. 在ARM cortex M里面应该算是比较弱的, 但是这仅仅是相对而已 ,对于8bit 16bit mcu ,新唐M051有着很多拿手绝活, 只可惜,一直沉睡在我的应用中. 没有发掘出来. 也是, 我的初衷就是用它来替代8位机, 更快更稳更便宜好用,我为啥还要坚守8bit呢,
第一步我已经迈出,并且付诸实践很多, 但是第二部,现在看来, 我才刚刚开始. 这不, 现在有这个一个需求,需要测量交流AC回路的频率,有50hz 60hz 一直600hz.
如图 所示,此电路可以产生比较好的方波, 在示波器上可以轻松的识别到正确的频率和脉宽,形状, 但是我用P20的引脚中断功能来做的时候, 无论是上升沿还是下降沿,都存在误触发的可能.
再用示波器仔细查看,原来是进入单片机的信号存在这样的中间状态,导致,误触发.
导致我对该端口的边沿中断的计数采集发生比较大的误差,尤其是50 60hz]的时候,居然会变成正常频率的2倍左右. 问题很大..
那么问题来了 肿么办, 加电容么? 幸好M0516提供了强大的debouce功能. 简言之就是防止端口上信号反弹的功能 , 你反弹了 我不采集你就可以了嘛. 我采样的时间间隔可根据现场和信号的特点进行变化. ,
发现这个好东西以后就立即想用起来. 老规矩 不管三七二十一,打开bsp里面的samplecode,然打开有个例程是SampleCode\StdDriver\GPIO_EINTAndDebounce
打开这个功能.很容易就找到了相关的配置, 移植到自己的工程,
- void KMF600_init_freqpin( void )
- {
- SYS_UnlockReg();
-
- /* 设置P20为外部输入中断 */
- GPIO_SetMode(P2, BIT0, GPIO_PMD_INPUT);
- GPIO_EnableInt(P2, 0, GPIO_INT_RISING);
- NVIC_EnableIRQ(GPIO_P2P3P4_IRQn);
-
- /* 使能debouce功能,并且选择边沿中断采样的时钟源和采样间隔
- * 此处为内部10K,间隔为4,那么采样的时钟最小时间为10K频率对应的周期,为1/10000s
- * 也就是100us,间隔设置为4,那么间隔时间就是400us,如此设置以后,明显频率采集变准了
- */
- GPIO_SET_DEBOUNCE_TIME(GPIO_DBCLKSRC_LIRC, GPIO_DBCLKSEL_4);
- GPIO_ENABLE_DEBOUNCE(P2, BIT0 );
- SYS_LockReg();
- }
复制代码
运行的情况:
大赞一下 ,debouce, 以后有类似的同步脉冲中断神马的,记得要开启,很管用.
|