Например TDA7294

Форум РадиоКот • Просмотр темы - последовательный опрос двух каналов внутреннего ацп atmega 8
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 21:34:08

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: последовательный опрос двух каналов внутреннего ацп atmega 8
СообщениеДобавлено: Пн июн 19, 2023 23:13:27 
Поставщик валерьянки для Кота

Карма: 4
Рейтинг сообщений: 210
Зарегистрирован: Сб май 07, 2011 17:52:59
Сообщений: 2466
Рейтинг сообщения: 0
Здравствуйте добрые люди! помогите исправить ошибку в С-кодировке. не работает опрос двух каналов внутреннего ацп в атмеге. на оба индикатора выводица только результат оцифровки одного канала mux5. вот сами функции
Спойлер//--- Функция оцифровки напряжения внутреним ацп MUX5 ---
unsigned int ADCV_Conv(unsigned char ch_ADC) //(переменная "канал ацп")
{
unsigned int adcv_value = 0; //сброс регистра хранения результата оцифровки напряжения
unsigned char set_ADMUX = ADMUX; //переменная для выбора канала АЦП
ADMUX |= ((0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(1<<MUX0)); //выбор канала АЦП MUX5
_delay_us(10); //пауза 10мкс
for(unsigned char i=0;i<measure;i++) //цикл суммирования результатов оцифровки 64 замеров
{
ADCSRA |= (1<<ADSC); //запуск АЦП
while((ADCSRA &(1<<ADSC))); //ожидание окончания преобразования
adcv_value += ADCW; //adcv_value=adcv_value+ADCW прибавим к сумме значений предыдущих измерений значение очередного измерения
}
return(unsigned int)adcv_value >> 6; //выйдем из функции и вернём среднее значение (из регистров результата ADCL и ADCH АЦП)
} //оцифровки 64 замеров в переменную типа (unsigned int)

//--- Функция оцифровки тока внутреним ацп MUX4 ---
unsigned int ADCI_Conv(unsigned char ch_ADC) //(переменная "канал ацп")
{
unsigned int adcv_value = 0; //сброс регистра хранения результата оцифровки напряжения
unsigned char set_ADMUX = ADMUX; //переменная для выбора канала АЦП
ADMUX |= ((0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(0<<MUX0)); //выбор канала АЦП MUX4
_delay_us(10); //пауза 10мкс
for(unsigned char i=0;i<measure;i++) //цикл суммирования результатов оцифровки 64 замеров
{
ADCSRA |= (1<<ADSC); //запуск АЦП
while((ADCSRA &(1<<ADSC))); //ожидание окончания преобразования
adcv_value += ADCW; //adcv_value=adcv_value+ADCW прибавим к сумме значений предыдущих измерений значение очередного измерения
}
return(unsigned int)adcv_value >> 7; //выйдем из функции и вернём 1/2 среднего значения (из регистров результата ADCL и ADCH АЦП)
} //оцифровки 64 замеров в переменную типа (unsigned int)

а вот цикл
Спойлерwhile(1)
{
Display1_ADC = ADCV_Conv(5); //считаем значение канала MUX5
ledprint_1(Display1_ADC); //отправим считанное значение в функцию вывода на индикатор вольтметра
_delay_ms(200); //пауза 0,2с
//Display2_ADC = ADCI_Conv(Read_3201()); //считаем значение регистра SPDR
Display2_ADC = ADCI_Conv(4); //считаем значение канала MUX4
ledprint_2(Display2_ADC); //отправим считанное значение в функцию вывода на индикатор амперметра
_delay_ms(200); //пауза 0,2с
}

_________________
душа человеческая темна и с легкостью обращается ко злу


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: последовательный опрос двух каналов внутреннего ацп atme
СообщениеДобавлено: Вт июн 20, 2023 00:45:56 
Открыл глаза

Карма: -7
Рейтинг сообщений: -1
Зарегистрирован: Пн июн 05, 2023 19:08:57
Сообщений: 50
Рейтинг сообщения: 0
У вас проблема простая:
Код:
ADMUX |= ((0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (0 << MUX0));
если при измерении напряжения в бите MUX0 была 1, то "логическим или" она не сбросится.
Можно сделать так:
Код:
unsigned char set_ADMUX = ADMUX; //переменная для выбора канала АЦП
set_ADMUX &= ((1 << REFS1) | (1 << REFS0)); // оставить только Vref
set_ADMUX |= ch_ADC; //выбор канала АЦП ch_ADC
ADMUX = set_ADMUX;
в обеих функциях измерения.
Можно функции ADCV_Conv и ADCI_Conv заменить на одну:
Код:
#define EXTRA_BITS 6
#if EXTRA_BITS > 6
#error EXTRA_BITS > 6
#endif
#define MEASUREMENTS (1 << EXTRA_BITS)

//--- Функция оцифровки ацп канал ch_ADC ---
unsigned int ADC_Conv(unsigned char ch_ADC) //(переменная "канал ацп")
{
    unsigned int adcv_value = 0; //сброс регистра хранения результата оцифровки напряжения
    unsigned char set_ADMUX = ADMUX; //переменная для выбора канала АЦП
    set_ADMUX &= ((1 << REFS1) | (1 << REFS0)); // оставить только Vref
    set_ADMUX |= ch_ADC; //выбор канала АЦП ch_ADC
    ADMUX = set_ADMUX;
    _delay_us(10); //пауза 10мкс
    for (unsigned char i = 0; i < MEASUREMENTS; i++) //цикл суммирования результатов оцифровки 64 замеров
    {
        ADCSRA |= (1 << ADSC); //запуск АЦП
        while ((ADCSRA & (1 << ADSC)))
            ; //ожидание окончания преобразования
        adcv_value += ADCW; //adcv_value=adcv_value+ADCW прибавим к сумме значений предыдущих измерений значение очередного измерения
    }
    return (unsigned int)adcv_value >> EXTRA_BITS; //выйдем из функции и вернём среднее значение (из регистров результата ADCL и ADCH АЦП)
} //оцифровки 64 замеров в переменную типа (unsigned int)
Почему-то, при измерении тока вы возвращаете только 1/2 среднего значения, но это легко исправить:
Код:
while (1) {
    Display1_ADC = ADC_Conv(5); //считаем значение канала 5
    ledprint_1(Display1_ADC); //отправим считанное значение в функцию вывода на индикатор вольтметра
    _delay_ms(200); //пауза 0,2с
    //Display2_ADC = ADCI_Conv(Read_3201()); //считаем значение регистра SPDR
    Display2_ADC = ADC_Conv(4) >> 1; // 1/2 среднего значения
    ledprint_2(Display2_ADC); //отправим считанное значение в функцию вывода на индикатор амперметра
    _delay_ms(200); //пауза 0,2с
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: последовательный опрос двух каналов внутреннего ацп atme
СообщениеДобавлено: Вт июн 20, 2023 14:32:32 
Поставщик валерьянки для Кота

Карма: 4
Рейтинг сообщений: 210
Зарегистрирован: Сб май 07, 2011 17:52:59
Сообщений: 2466
Рейтинг сообщения: 0
Eleprekra благодарствую вам добрый человек :beer: вставил вашу кодировку, а свою ахинею закоментировал. всё заработало как надо. деление /128 в канале тока нужно для правильногоо отображения предела 50а. в канале mux5 верхний предел 99,9в, поэтому там просто усреднение /64
СпойлерИзображение

сегодня после каторги попробую пустить в красную верёвочку полсотни ампер и откалибровать дивайс
СпойлерИзображение

_________________
душа человеческая темна и с легкостью обращается ко злу


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: andrusha152 и гости: 30


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y