PIC adc模块的配置有如下要点:
1. adc模块本身:
注意,Auto-conversion Trigger和ADC的clock是两个概念。
auto-conversion Trigger的频率不得超过ADC采样一次的总时长。而真正的采样率是auto-conversion Trigger的頻率。
采样的过程中,那个TAD,可以认为是ad采样中,一系列流水线工作的节拍。一次AD采样会包括如下环节:
- 接入检测电路,充电
- 断开,开始2分法逼近,得到输出digital的各个bit的值。
- 输出。
- 放电。
我们的设计目标是100us一次采样即采样率=10ksa/s,所以,46us符合要求。
Positive reference和 Negative Reference是信号进入单片机时,被修正到的峰峰值。ad如果有10位,那么采样值1023对应-Positive Reference那个电压;采样值0,对应Vss那个电压。Vss一般就是0。
左对齐和右对齐的概念,只有对那些高于8bits的AD采样芯片才会有意义。指的是把测量结果对其到16Bits,高低两个字节的左边MSB还是右边LSB。左对齐可以直接很方便地丢弃掉低位测量值,如果电路本身电压基准有抖动,那么直接丢掉低位就行,虽然AD有10bits,12Bits,但是我们只用8Bits.
2.采样频率发生源( CCP)
注意,CCP模块需要设定上述两个属性。第一个属性是指定一个Timer. Timer本身要已经把分频器分好。另外要设置为Autoconversion模式,这样CCP5模块才能真的去连接到Adc那里。
然后注意CCP中断无需打开。因为测量值测完之后,你才能够取走。所以真正的中断源是adc的中断。
然后,一个隐藏知识。CCP需要打开高级模式,配置: CCPR*h 和CCPR*L
它的实际工作模式是这样的:CCP会以使用者的方式去操控那个Timer。注意,和Timer日常工作模式不同,CCP模块此时是个正计时器。从0开始数,数到 CCPR*h-CCPR*l所设定的那个16bits数值时就会触发,触发会,它会去置 adc的开始采样寄存器位:
ADCON0bits.GO_nDONE = 1;
然后adc就会按照自己设定的TAD的节拍,走完所有的节拍,结果生成后:
ADCON0bits.GO_nDONE = 0;
同时生成中断。中断的频率,或者说采样率,要顾及到单片机本身的算力。比如留出1000个指令周期,可能是比较充裕的。这个上限要自己去测。
3.定时器
定时器的配置要点是:Timer这里的Timer Period的具体设置其实是无效的。因为它会成为一个被动器件,它的TimerPeriod会由CCP模块控制,以正计时的模式运行。这里配置其实全无意义。只有那个Timer Period的下限2us有意义,被用来计算與目標采样率相当的采样点之间的时间差所对应的那个数字应该是几——2us的最小时间刻度,那么100us的采样率就是50 = 100us/2uS.
这里是实际的最终测量波形,信号是工频,一个整周期:
比对示波器图样:
采样值序列要转换为实际的测量值,还需要进行标定。标定主要有两个指标:
1.零点
2.斜率。
所有的一次函数,最关键的指标就是这两个值。一个是整形,一个是 float.