牛卧堂MCU技术交流

标题: 请注意新唐M051可不是简单的51,是完美的M0单片机 [打印本页]

作者: harvardx    时间: 2016-7-17 23:53
标题: 请注意新唐M051可不是简单的51,是完美的M0单片机
本帖最后由 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

打开这个功能.很容易就找到了相关的配置, 移植到自己的工程,

  1. void KMF600_init_freqpin( void )
  2. {
  3.     SYS_UnlockReg();
  4.    
  5.     /* 设置P20为外部输入中断 */
  6.     GPIO_SetMode(P2, BIT0, GPIO_PMD_INPUT);
  7.     GPIO_EnableInt(P2, 0, GPIO_INT_RISING);
  8.     NVIC_EnableIRQ(GPIO_P2P3P4_IRQn);
  9.    
  10.     /*  使能debouce功能,并且选择边沿中断采样的时钟源和采样间隔
  11.     *   此处为内部10K,间隔为4,那么采样的时钟最小时间为10K频率对应的周期,为1/10000s
  12.     *   也就是100us,间隔设置为4,那么间隔时间就是400us,如此设置以后,明显频率采集变准了
  13.     */
  14.     GPIO_SET_DEBOUNCE_TIME(GPIO_DBCLKSRC_LIRC, GPIO_DBCLKSEL_4);
  15.     GPIO_ENABLE_DEBOUNCE(P2, BIT0 );

  16.     SYS_LockReg();
  17. }
复制代码

运行的情况:







   大赞一下 ,debouce, 以后有类似的同步脉冲中断神马的,记得要开启,很管用.


  

5%{I4NU1_$P{H2AL3U (486.22 KB, 下载次数: 391)

5%{I4NU1_$P{H2AL3U

Y0GKS@8JAH2GRV~0`~IFZ9E.png (470.32 KB, 下载次数: 384)

Y0GKS@8JAH2GRV~0`~IFZ9E.png

作者: wwzgch2015    时间: 2016-7-18 09:38
学习了

作者: slotg    时间: 2016-7-18 10:12
很好的经验帖,一定要顶。
作者: harvardx    时间: 2016-7-18 22:02
debounce 确实是个好东西 大家有空留意下
作者: ToDo    时间: 2016-7-21 16:37
不錯。
感覺台灣的MCU都很有特色,經常會在MCU裡面添加一些很實用的功能,在某些場合確實非常的有用。
作者: harvardx    时间: 2016-7-21 20:42
还是真是 以前也用了个51  也有类似功能 没觉得 ,这次用新唐, 发现咱也有 就引起重视了 刚好也是遇到问题. 然后依照samplecode里面的例程 稍微设置了 debounce的时钟和时间 ,就迎刃而解了
作者: harvardx    时间: 2016-7-29 12:53
应该是可以的 这是针对io的数字输入输出功能的. TIM应该是其中一种




欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/) Powered by Discuz! X3.2