惯例先上图。
增加了分频功能和频率触发捕获功能。
以前一直以为示波器是不断的捕获数据显示,但是想不通的是如果信号频率极高的话,画面会移动动的飞快。
后来才明白,原来示波器只是捕获一定时间段的数据并进行计算,而不是不停的读数据。
这次终于把AVR单片机的ADC分频功能实现了,这样就能指定特定频率的分频了。就是界面上的X4,X8等按钮的功能。
不过奇怪的是2分频和128分频好像有问题,2分频无法获得正确的数据,而128分频的时间计算很不正确。
这里贴出ADC配置函数,使用的是ADC5脚:(代码中的pin不是脚的代号而是频率)
void AdcInit(int pin)
{
ADCSRA = 0;
ADMUX = 0;
ADMUX = _BV(MUX0) | _BV(MUX2) | _BV(REFS0);
switch(pin)
{
case 0: // 4
ADCSRA = _BV(ADPS1);
break;
case 1: // 8
ADCSRA = _BV(ADPS0) | _BV(ADPS1);
break;
case 2: // 16
ADCSRA = _BV(ADPS2);
break;
case 3: // 32
ADCSRA = _BV(ADPS2) | _BV(ADPS0);
break;
case 4: // 64
ADCSRA = _BV(ADPS2) | _BV(ADPS1);
break;
case 5: // 128
ADCSRA = _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
break;
}
ADCSRA |= _BV(ADEN);
}
开始我没有配置REFS0,导致不能正确的读数,另外数据是用阻塞的方式获得,没有使用ADC中断。现在简易示波器能用了,就差搞个信号发生器来试试了。
网友评论