Как опросит два аналоговых датчиков
- Войдите на сайт для отправки комментариев
Пт, 08/09/2017 - 16:34
char val2;
ISR (ADC_vect)
{
ACP=ADCW;
ADCSRA |=(1<<ADSC);
}
int main(void)
{ DDRC &=~(1<<PC1);
ADCSRA |=(1<<ADEN)
//разрешение использование АЦП
|(1<<ADIE)|(0<<ADPS2)|(1<<ADPS1)|(0<<ADPS0);//4 delim
ADMUX |=(1<<REFS0)//подключили к 5В
|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(0<<MUX0);//arduino A1
ADCSRA |=(1<<ADSC);
val2=(ACP>>2);
Ну, кусок кода, и чо? Вопрос-то в чём?
Опрос идет только по MUX0 А1 в ардуино, теперь одновременно опросить второй вход (А2) ардуино
пробовал вот так но не получается читать два аналоговых сигналов
ISR (ADC_vect) { ACP=ADCW; ADCSRA |=(1<<ADSC); if (sel_chanel == 100) {val=(ACP>>2)/2; eeprom_update_byte(1,val); sel_chanel=0; } sel_chanel++; } int main(void) { DDRC &=~(1<<PC1); DDRB |=(1<<PB5); PORTB &=~(1<<PB5); ADCSRA |=(1<<ADEN) //разрешение использование АЦП |(1<<ADIE)|(0<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);//4 delim ADMUX |=(1<<REFS0)|(0<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0);;//подключили к 5В //arduino A1 ADCSRA |=(1<<ADSC); while(1) { cli(); if (sel_chanel < 100) { ADMUX |=(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(0<<MUX0); ADMUX &=~(1<<MUX2); val2=(ACP>>2)/2; eeprom_update_byte(0,val2); } if (sel_chanel == 100) {ADMUX &=~(1<<MUX1); ADMUX |=(0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(0<<MUX0); }А чем Вас не устраивает analogRead и среда Arduino?
Мне легче писать на си в среде атмел студио
Ну, раз Вам легче написать прямую работу с АЦП вместо одной строчки analogRead, то пишите.
А мне показалось (по этой теме), что Вы просто не умеете этого делать. Наверное, я ошибся.
Ну вы тогда по пробуйте написать в атмел студио analogRead
Ну вы тогда по пробуйте написать в атмел студио analogRead
Двумя постами ранее Вы утверждали, что это легче, чем в Arduino IDE.
Ну вы тогда по пробуйте написать в атмел студио analogRead
Да, где уж мне?!? Я же не говорил, что мне легче в студии писать :))))
Это Вы сказали, что Вам легче писать в студии, ну, а раз легче, то пишите на здоровье :)))))
Не подскажите как опрашивать последовательно что то у меня не получается
Попробуйте вот так на 4 аналога, а вообще здесь была тема и на 2
volatile int data0; volatile int data1; volatile int data2; volatile int data3; float V0; float V1; float V2; float V3; unsigned long time; void setup() { Serial.begin(9600); DDRC = B000000; // назначает выводы с 14 по 19 входными PORTC = B000000; // устанавливает HIGH на выводах с 14 по 19 (на 19 LOW) //OCR0A=0xAF; //TIMSK0|=1<<OCIE0A; ADMUX = 1 << REFS0; // AVCC with external capacitor at AREF pin ADCSRA = (1 << ADEN) | (1 << ADATE) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); ADCSRB = (0 << ADTS1) | (0 << ADTS0); // Можно закоментировать } void taime() { ADCSRA |= (1 << ADSC); // Запускаем преобразование static uint8_t analog = 0; Serial.println(analog); time = micros(); ADMUX = ADMUX & 0b11111000 | analog; switch (analog) { case 0: data3 = ADC; ++analog; break; case 1: data0 = ADC; ++analog; break; case 2: data1 = ADC; ++analog; break; case 3: data2 = ADC; analog = 0; break; } time = (micros() - time); } void loop() { taime(); V0 = (float) data0 * 0.0047031; // Переводим в вольты V1 = (float) data1 * 0.0047031; // Переводим в вольты V2 = (float) data2 * 0.0047031; // Переводим в вольты V3 = (float) data3 * 0.0047031; // Переводим в вольты // 0.0047031 = Vcc / 1024 Serial.print("A0 = "); Serial.print(V0, 3); Serial.println(" V "); Serial.print("A1 = "); Serial.print(V1, 3); Serial.println(" V "); Serial.print("A2 = "); Serial.print(V2, 3); Serial.println(" V "); Serial.print("A3 = "); Serial.print(V3, 3); Serial.println(" V "); Serial.print("T = "); Serial.print(time); Serial.println(" mks"); delay (50); }стр 84 в http://nonlinmod.sgu.ru/doc/doc2014_12.pdf я не проверял.
пс:
/**/ void anInit(void) { ADMUX = (1 << REFS0); ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); } int anRead(unsigned char Channel) { ADMUX = (1 << REFS0) | (1 << ADLAR) | Channel; ADCSRA |= (1 << ADSC); while (ADCSRA & (1 << ADSC)); return ADC; } int main(void) { init(); //setup() Serial.begin(9600); anInit(); while (1) { delay(100); Serial.println(); Serial.print(anRead(0)); Serial.print(" "); Serial.print(anRead(1)); } return 0; } /*Скетч использует 1952 байт (6%) памяти устройства. Всего доступно 30720 байт. Глобальные переменные используют 188 байт (9%) динамической памяти, оставляя 1860 байт для локальных переменных. Максимум: 2048 байт. */ППС:http://forum.arduino.ua/viewtopic.php?id=1071
Что там пробовать...