【AC7811开发板试用活动】ACMP学习之初始化代码注释、实验初步(含PWM输入捕获)
此贴是本人AC7811测试报告的第三部分(9)。
第一部分(1-5),请点链接:https://bbs.21ic.com/icview-2873036-1-1.html
第二部分(6-8),请点链接:https://bbs.21ic.com/icview-2875766-1-1.html
一、官方演示代码,其实用心良苦
首先,打开官方ACMP例程,ACMP初始化函数是这样写的:
发现代码有些繁琐。比如:
红色框所示:定义了一个ACMP_InitType类型的结构体指针,又定义了一个ACMP_InitType类型的结构体变量。
绿色框所示:定义了一个ACMP_DACType类型的结构体指针,又定义了一个ACMP_DACType类型的结构体变量。
然后把结构体变量的地址赋值给指针----变量地址不是可以直接使用吗?
蓝色框、棕色框所示:既然可以在定义时直接给结构体赋初值,为什么又要用“结构体指针->成员”的方式赋值?
几乎每个例程都有这种情况。
为什么写得这么繁琐?其实想一想也就明白了:
写演示代码的工程师,其实用心良苦,Ta在告诉我们,“可以这样写,也可以那样写”。
这让我想起前几天看过的一个贴子,贴主问为什么这样写:
GPIO_SetFunc(49, 1);
而不是全部这样写:
GPIO_SetFunc(GPIO_PD1, 1);
其实,演示代码里面,展示各种写法,才更有启发性。
所以,应该表示感谢。
二、不必完全照抄官方演示代码
回到ACMP的初始化函数:
根据官方示例,我整理了以下几种初始化函数写法:
上图这种写法,直接在定义初始化结构体时赋初值,然后用取址作为参数初始化。
上图这种写法,可以单独修改结构体元素的值,但与图1的“结构体指针->成员”不同,用的是“结构体.成员”,
请对照图1和图3的紫色框所示。
其实写法当然不止这些。我的意思是,实际应用时,可以任意组合,而不是照抄官方演示代码。
三、ACMP的初始化步骤
ACMP初始化的过程主要分两部分:
先初始化比较器,再初始化内部DAC。
以下是我整理的初始化代码的注释:
四、官方手册ACMP部分有2处可能是疏漏
可能是疏漏,更可能是我没有完全理解:
上图红框内那句,可能是笔误。
上图表格中,缺少了ACMP0正常模式中断。
也可能是我走马观花看错了,请谅解!
五、一个未整理完成的实验
前些天,做了一个ACMP实验:零序线圈感应220V交流电,用比较器检测其尖峰值,当感应电压过500mV时,
比较器产生中断,在中断函数里翻转电平,生成与市电同频率的脉冲。并用一个PWM输入捕获功能,计算脉冲频率值。
因为零序线圈连接部分的电路还不完善,这个实验以后再继续。
先把实验过程中的一些图片,和源程序发出来吧。
下图是用到的零序线圈。中间穿过了220V市电的火线或零线(是或,不是和,图中2股导线是并联在一起的)。
PS:请注意用电安全!
下面3个图是实验现场。
下面3个图分别是:
直接用示波器测量零序感应电压波形;
用二极管半波整流后的波形;
半波整流后的波形(黄)和ACMP中断函数里生成的脉冲波形(绿)。
|