Перейти к содержанию

Опрос двух каналов АЦП


Ivarrr

Рекомендуемые сообщения

Помогите понять где ошибка... не получается реализовать попеременный опрос 2ух каналов АЦП. Данные с одного канала должны передаваться на первый индикатор как напряжение, а со второго, соответственно на второй индикатор как сила тока.

 

#define F_CPU 8000000U
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <util/delay.h>

#define INDICATOR PORTD
#define RANK PORTB

unsigned int UR1=0, UR2=0, UR3=0, UR4=0; //переменные для деления на разряды значения напряжения
unsigned int IR1=0, IR2=0, IR3=0, IR4=0; //переменные для деления на разряды значения силы тока
int GainControl=1;
int current_ch=0;
float I, U;
unsigned char voltage, current;

unsigned int NUMS [10] = {0b11000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001, 0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10010000}; // от 0 до 9

int main(void)
{
    DDRB=0xFF; PORTB=0x00; //ножки порта B для разряда
    DDRC=0x00; PORTC=0x00; //ножки порта C для АЦП
    DDRD=0xFF; PORTD=0xFF; //ножки порта D для индикаторов
    
    TCCR0 |= (1<<CS01); TCCR0 &= ~((1<<CS00) | (1<<CS02)); //настройка частоты таймера f/8
    TIMSK |= (1<<TOIE0); //разрешение прерываний по переполнению таймера
    TCNT0=0; // обнуление счетчика
    
    ADCSRA |= ((1<<ADEN) | (1<<ADSC) | (1<<ADPS2)); // запуск АЦП, запуск преобразования, предделитель 16
    ADCSRA &= ~((1<<ADFR) | (1<<ADIF) | (1<<ADPS1) | (1<<ADPS0)); // режим преобразвания прерывестый, флаг перобразования опущен, предделитель 16
    ADMUX |= ((1<<REFS0) | (1<<REFS1)); //источник опорного напряжения 2.56В
    ADMUX &= ~((1<<ADLAR) | (1<<MUX0) | (1<<MUX1) | (1<< MUX2) | (1<<MUX3)); // направление записи, измерительная ножка ADC0;
    
    sei(); // вкл прерывания
    while (1) 
    {
        if (ADCSRA & (1<<ADIF))
        {
                    U_Convert((U*5.00/1024)*100);
                    I_convert((I*5.00/1024)*100);
        }
    }
}

void U_Convert (unsigned int U_num)  //деление на разряды напряжения
{
    UR1=U_num/100;
    UR2=U_num%100/10;
    UR3=U_num%10;
}

void I_convert (unsigned int I_num) //деление на разряды тока
{    IR1=I_num/100;
    IR2=I_num%100/10;
    IR3=I_num%10;
}

ISR (TIMER0_OVF_vect)
{        
    if (GainControl == 1) {INDICATOR = 0b11111110; RANK = NUMS[UR1];} //отображение 1ого разряда напряжения
    if (GainControl == 2) {INDICATOR = 0b11111101; RANK = NUMS[UR2];} //отображение 2ого разряда напряжения
    if (GainControl == 3) {INDICATOR = 0b11111011; RANK = NUMS[UR3];} //отображение 3ого разряда напряжения    
    if (GainControl == 4) {INDICATOR = 0b11110111; RANK = NUMS[IR1];} //отображение 1ого разряды силы тока
    if (GainControl == 5) {INDICATOR = 0b11101111; RANK = NUMS[IR2];} //отображение 2ого разряды силы тока
    if (GainControl == 6) {INDICATOR = 0b11011111; RANK = NUMS[IR3];} //отображение 3ого разряды силы тока
    GainControl++;
    if (GainControl > 6) GainControl=0; //  мониторинг переменной для управления затворами    
}

ISR (ADC_vect) 
{
    if (current_ch == 0)
      {
          U = ADC;
          voltage = (U*2.56/1024)*100;
          ADMUX |= (1<<MUX0);
          current_ch = 1;
          ADCSRA |= (1<<ADSC);
      }
      else
      {
          I = ADC;
          current = (I*2.56/1024)*100;
          ADMUX &= ~(1<<MUX0);
          current_ch = 0;
          ADCSRA |= (1<<ADSC);
      }
}

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 час назад, Ivarrr сказал:

в чем? В исходниках с машинным кодом?

что значит машинный код ?

пример с работающей программы ;

rcall  I_ADC

 rcall U_ADC

rjmp PC-2

I_ADC:

ldi temp,(1<<REFS1)+(1<<REFS0)+(1<<adlar)+(1<<MUX2)+(1<<MUX1)+(1<<MUX0); Выбор ADC7, выравнивание влево, ИОН=2.56 подключен к AREF
out ADMUX, temp
ldi  temp,(1<<ADEN)+(1<<ADSC)+(1<<ADPS1)+(1<<ADPS2) out ADCSRA,temp
sbic ADCSRA,ADSC rjmp PC-1 in temp,ADCH

но походу у вас  другие проблемы

 

Ссылка на комментарий
Поделиться на другие сайты

Что именно не получается, и что происходит вместо того, что должно быть? Яб может подсказал, но знакомый экстрасенс в отпуске. :lol:

И где у вас, как минимум, прототипы функций перед main()? Или это я отстал от жизни и это какой-то новомодный СИ?:crazy:

12 часов назад, Ivarrr сказал:

unsigned int UR1=0, UR2=0, UR3=0, UR4=0; //переменные для деления на разряды значения напряжения
unsigned int IR1=0, IR2=0, IR3=0, IR4=0; //переменные для деления на разряды значения силы тока

А зачем вам 2-х байтовые переменные, для храниния чисел от 0 до 9-ти? Понятно что ресурсы позволяют, но это называется быдлокодингом.

11 часов назад, _abk_ сказал:

Жесть...

А че жесть, такие сейчас "уроки по МК" в интернетах делают. Если чел смог зажечь светодиод - то он думает, что других уже может учить...

Изменено пользователем Ermak
Ссылка на комментарий
Поделиться на другие сайты

13 часов назад, Ivarrr сказал:

ISR (TIMER0_OVF_vect)
{        
    if (GainControl == 1) {INDICATOR = 0b11111110; RANK = NUMS[UR1];} //отображение 1ого разряда напряжения
    if (GainControl == 2) {INDICATOR = 0b11111101; RANK = NUMS[UR2];} //отображение 2ого разряда напряжения
    if (GainControl == 3) {INDICATOR = 0b11111011; RANK = NUMS[UR3];} //отображение 3ого разряда напряжения    
    if (GainControl == 4) {INDICATOR = 0b11110111; RANK = NUMS[IR1];} //отображение 1ого разряды силы тока
    if (GainControl == 5) {INDICATOR = 0b11101111; RANK = NUMS[IR2];} //отображение 2ого разряды силы тока
    if (GainControl == 6) {INDICATOR = 0b11011111; RANK = NUMS[IR3];} //отображение 3ого разряды силы тока
    GainControl++;
    if (GainControl > 6) GainControl=0; //  мониторинг переменной для управления затворами    
}

unsigned char NUMS[6];

ISR (TIMER0_OVF_vect)
{
    INDICATOR = ~(1<<GainControl);
    RANK = NUMS[GainControl];
    GainControl++;
        if (GainControl > 6) GainControl=0; //  мониторинг переменной для управления затворами    
}

13 часов назад, Ivarrr сказал:

void U_Convert (unsigned int U_num)  //деление на разряды напряжения
{
    UR1=U_num/100;
    UR2=U_num%100/10;
    UR3=U_num%10;
}

void I_convert (unsigned int I_num) //деление на разряды тока
{    IR1=I_num/100;
    IR2=I_num%100/10;
    IR3=I_num%10;
}

void NumToSymb(unsigned char Num)
{
    unsigned char i=0, j=0;
      while(Num>99)
    {
        j++;
        Num -=100;
    }
    while(Num>9)
    {
        i++;
        Num -=10;
    }

    Symb[2]=j
    Symb[1]=i;
    Symb[0]=Num;
}

Помоему так рациональнее, чем куча делений, которые контроллер не умеет.

Изменено пользователем Ermak
Ссылка на комментарий
Поделиться на другие сайты

30.01.2021 в 12:17, Ivarrr сказал:

Разбираться в чем? В исходниках с машинным кодом?

Если можете, то и в кодах есть.

А так и Си и асемблер и прочее, прочее  есть, в инете всё есть.

А вы пытаетесь сделать что то своё, кривое

30.01.2021 в 11:05, Ivarrr сказал:

Помогите понять где ошибка... не получается

Так можно кучу времени сэкономить и изобретать велосипед с треугольными колёсами, взять исходник (обычно даже с коментариями) и его понять.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...