首先,讲一下 MSP430F149 的结构。MSP430 系列单片机是美国德州仪器(TI)1996年开始推向市场的一种16位超低功耗、具有精准指令集(RISC)的混合信号处理器(Mixed Signal Processor)。单个芯片的价格在 20 元左右。MSP430F149 是最小系统板,其中自带了 12 位的ADC模块,液晶显示屏我们可以另加,采集到单片机内部也就是 4096 个不同的读数。再由单片机引脚的最高电压是2.5V,易得理论精度为 0.6 mV,也就是说ADC的位数越多,数据采集精度越高。需要什么样的ADC模块也可以根据需求另外加上。另外提示一点 MSP430F149 的RAM只有 2K。以上都是一些用的上的常识,我们当初写程控的时候出过一些相关的问题,在这里写在前面,希望读者引以为鉴。
示波器的制作主要分为三部分:ADC采集,数据处理和显示。今天主要讲解ADC模块和数据处理。
首先说一下采用系统板自带的ADC的采集。ADC采集首先分为选择输入通道,选择采样频率。MSP430F149有很多功能和51不太一样,引脚全都要先定义后使用,这一点对初学者来说很不方便,但是相信通过视频课学习掌握。那么来点干货放在附录里,这是我们参加TI杯比赛的时候的一个程控,这里是一个ADC初始化的程控,仅供大家学习和参考。
第二部分是数据处理。笔者提供一种思路,采用定时中断的方式将将ADC模块采集到的数据存放到一个数组里,然后对整个数组进行数据处理。在处理整个数组的数据时要注意数据的精度和位数,笔者在这里不再赘述。自带的 12 位 ADC 模块一定会有失真,具体表现就是如果把所有采集的数据绘图,会发现图形上有很多小锯齿,这就需要我们处理这些数据,留下失真较小和不失真的数据,推荐大家去学习一下 SMOOTH 函数,这是一个可以把曲线变平滑的函数(现在又学了很多相关的知识关于滤波)。在这些都处理完了以后我们才可以进行真正意义上的数据分析处理。示波器所要显示的信息有两个:波幅和频率。波幅我们可以用一个排序然后求峰峰值的方法得到。频率则可以比较两个最大值出现的时间来得到。如果有杂波的信号可以用傅里叶变换(FFT)来分离基波和各次谐波,从而求出频率和波幅。
我们在比赛的时候也出现了很多问题,理论上我们可以显示 0 ~ 1000 Hz 的频率, 600 Hz 以上的频率无法显示,而且峰峰值测量误差较大,欢迎大佬留言讨论。
附录(ADC模块初始化函数):
void ADC_Init()
{
P6SEL|=0x01;
ADC12CTL0 &= ~(ENC);
ADC12MCTL0= SREF0 + INCH_0+EOS;
ADC12CTL0 =0x00;
ADC12CTL0|= ADC12ON + SHT0_1+REFON+REF2_5V + MSC ;
ADC12CTL1 =0x00;
ADC12CTL1|= CSTARTADD_0 + SHP + CONSEQ_2 + ADC12SSEL_0 + ADC12DIV_0;
ADC12IE = 0;
ADC12IE = 0x00;
ADC12CTL0|= ENC + ADC12SC;
return;
}