olegue писал(а):а вот это надо бы попробовать
попробуй ещё добавить стабилизацию входа... как советует даташит.
ISR(TIMER2_COMPA_vect) {
ADMUX = 0x40; // set ADC to read pin A0, ADLAR to 1 (right adjust)
delay_us(10); // стабилизация входа...
sbi(ADCSRA, ADSC); // start ADC sample
while (bit_is_set(ADCSRA, ADSC)); // wait until ADSC bit goes low = new sample ready
rsValue=ADCW;
...
стабилизация входа нужна чтобы после переключения мультиплексора напряжение "устаканилось"... ))
в твоём случае (с учетом ограничениями таймера = 45 мкс) можно не ставить задержку delay_us(10), а сделать по другому...
ISR(TIMER2_COMPA_vect) {
sbi(ADCSRA, ADSC); // start ADC sample
while (bit_is_set(ADCSRA, ADSC)); // wait until ADSC bit goes low = new sample ready
rsValue=ADCW;
ADMUX = 0x41; // set ADC to read pin A1, ADLAR to 1 (right adjust)
sbi(ADCSRA, ADSC); // start ADC sample
while (bit_is_set(ADCSRA, ADSC)); // wait until ADSC bit goes low = new sample ready
recByteCount++; // increment sample counter
bufByteCount++;
if (bufByteCount == 64 && bufWrite == 0) {
bufByteCount = 0;
bufWrite = 1;
} else if (bufByteCount == 64 & bufWrite == 1) {
bufByteCount = 0;
bufWrite = 0;
}
if (bufWrite == 0) {
buf00[bufByteCount] = (ADCW>>2);
}
if (bufWrite == 1) {
buf01[bufByteCount] = (ADCW>>2);
}
ADMUX = 0x40; // set ADC to read pin A0, ADLAR to 1 (right adjust)
}
в этом случае, при следующем прерывании таймера, мультиплексор уже окажется подключён к каналу 0.
а так как следующее прерывание таймера наступит через 45 мкс... то за это время напряжение на канале 0 уже "устаканится"... ))
стабилизация входа... нужна только при точных измерениях.
при записи звука точность не требуется.
Добавлено after 32 minutes 21 second:
а тут что ты делаешь ?
////////////// НАЧИНАЕМ С ОБРАБОТКИ ВХОДА А0 ////////////////////////
// Каждые 100 мс мы накапливаем значения (для усреднения)
if (timerRSon==0){ // запустим таймер для отображения часов
timerRS=millis(); // включим миллис
timerRSon=1;
}
if (timerRSon==1){
if (millis()-timerRS>50)
{
////////////
//rsValue=analogRead(A0);
lcd.setCursor(0,0);
///sprintf(buffer, "Pow:%05i",rsValue);
///lcd.print(buffer);
/////////////
SrV=SrV+rsValue;
timerRSon=0;
}
}
// Каждые 1000 мс мы отображаем усредненное значение
if (timerLCLon==0){ // запустим таймер для отображения часов
timerLCL=millis(); // включим миллис
timerLCLon=1;
}
if (timerLCLon==1){
if (millis()-timerLCL>1000)
{
//lcd.setCursor(0,0);
SrVmid=SrV/20;
if (SrVmid<125) SrVmid=125; // меньше 125 - это 0%
procSrV=((SrVmid-125)*100)/194; //в % макс -318(320), мин 125, 320-125=195
sprintf(buffer, "Power:%04i (%02i)",SrV/20,procSrV);
lcd.print(buffer);
//Show_time();
timerLCLon=0;
SrV=0;
///////////////////////
}
}
как ты подключаешь батарейку ? где схема ?
и зачем накапливаем ? и зачем усреднения ?
