Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
3 / 3 / 1
Регистрация: 02.04.2018
Сообщений: 172
1

алгоритм включения двух АЦП

11.05.2021, 21:45. Показов 653. Ответов 10
Метки нет (Все метки)

я так понял запустить АЦП на AVR нужно по следующему алгоритму.

1) включаем АЦП
2) устанавливаем делитель 2,4,8....
3) устанавливаем опорное напряжение питания или ареф
4) выбор ацп 0.1.2.3 и т.п.
5) запустить преобразование.
6) читаем данные

но как выбрать второй ацп? такой алгоритм почему-то не работает.

1) включаем АЦП
2) устанавливаем делитель 16
3) устанавливаем опорное напряжение питания Vcc
4) выбор ацп 0.
5) запустить преобразование.
6) читаем данные ацп 0.
7) выбор ацп 1.
8) читаем данные ацп 1.
9) выбор ацп 0.
10) читаем данные ацп 0.
и т.д.

Не могу найти, как остановить преобразование, чтобы поменять биты с:
C++
1
ADMUX |= (0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3);
на:
C++
1
ADMUX |= (1 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2021, 21:45
Ответы с готовыми решениями:

Подскажите алгоритм отлова пилы на входе АЦП.
Привет. Ребят подскажите как понять что на входе АЦП есть пила? Задача такая: На холостом ходу...

Алгоритм работы с ацп АЦП STM32F103
Здравствуйте, уважаемые форумчане. Подскажите пожалуйста алгоритм работы с ацп. Допустим мне надо...

Данные с двух каналов АЦП по очередно.[Решено]
Всем привет. Столкнулся с непоняткой, чип stm8s003f на время теста подцепил два переменных...

Алгоритм сортировки включения
Помогите пожалуйста решить Теорию алгоритма Записать алгоритм сортировки в таблице чисел А...

10
964 / 591 / 97
Регистрация: 15.05.2012
Сообщений: 3,482
12.05.2021, 09:43 2
Цитата Сообщение от SergeyKagen Посмотреть сообщение
7) выбор ацп 1.
8) читаем данные ацп 1.
Запуска нет.

Добавлено через 28 секунд
Цитата Сообщение от SergeyKagen Посмотреть сообщение
5) запустить преобразование.
6) читаем данные
Ожидания конца преобразования нет.
0
1599 / 823 / 341
Регистрация: 11.10.2018
Сообщений: 4,325
12.05.2021, 11:54 3
Здравствуйте. А какой микроконтроллер?
0
3 / 3 / 1
Регистрация: 02.04.2018
Сообщений: 172
12.05.2021, 12:00  [ТС] 4
Цитата Сообщение от pyzhman Посмотреть сообщение
Запуска нет.
его каждый раз нужно запускать, я думал он после запуска автоматом работает.

Цитата Сообщение от FFPowerMan Посмотреть сообщение
Здравствуйте. А какой микроконтроллер?
Atmega328
0
1599 / 823 / 341
Регистрация: 11.10.2018
Сообщений: 4,325
12.05.2021, 12:08 5
Есть одноразовый режим, а есть и многоразовый режим. Вы документацию читали? Что написано?
Отключить если хотите - отключите сразу весь блок АЦП.
0
2978 / 1786 / 357
Регистрация: 09.09.2017
Сообщений: 7,402
12.05.2021, 13:46 6
Цитата Сообщение от SergeyKagen Посмотреть сообщение
Atmega328
но как выбрать второй ацп?
Но у него нет второго АЦП. Или имелось в виду "другой канал"?
Цитата Сообщение от SergeyKagen Посмотреть сообщение
его каждый раз нужно запускать, я думал он после запуска автоматом работает.
Покажите как вы это настроили?
Цитата Сообщение от SergeyKagen Посмотреть сообщение
5) запустить преобразование.
6) читаем данные ацп 0.
7) выбор ацп 1.
8) читаем данные ацп 1.
9) выбор ацп 0.
10) читаем данные ацп 0.
Мне в свое время не удалось быстро переключаться между каналами в непрерывном режиме преобразования. Хотя наверняка это я что-то делал неправильно, например не вовремя переключал каналы.
Опять же нужен код.
0
10 / 10 / 4
Регистрация: 09.12.2017
Сообщений: 296
13.05.2021, 01:27 7
Можно так Это для Atmega 8
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//Настройки АЦП
    //ADCSRA
    ADCSRA |= (1<<ADEN) //Включить АЦП
    | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0); //Делитель 64= 128 кГц
    //ADMUX
    ADMUX |=(0<<REFS1)|(1<<REFS0); //Опорное напряжение AVcc +5v
    
    
    // Чтение каналов
    int32_t readADC(int32_t ch) 
{
    //unsigned char set_admux = ADMUX;
    int32_t set_admux = ADMUX;
    set_admux &= ~((1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0));
    switch(ch)
    {
        case 1: set_admux |= ((0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0));break;
        case 2: set_admux |= ((0<<MUX3) | (0<<MUX2) | (1<<MUX1) | (0<<MUX0));break;
        case 3: set_admux |= ((0<<MUX3) | (0<<MUX2) | (1<<MUX1) | (1<<MUX0));break;
        default:break;
    }
 
    ADMUX = set_admux;
    _delay_us(10);
    // Прочитать 32 раза и вывести среднее
    int32_t tmp = 0;
    for (int32_t i=0;i<32;i++)
    {
        ADCSRA |= (1<<ADSC); //Запуск преобразования
        while ((ADCSRA &(1<<ADSC))); //Ждем окончания
        tmp += ADCW; //tmp = tmp + ADC
    }
    return tmp/32;
}


Можно использовать прерывания ADC

Добавлено через 1 час 17 минут
Вот нашел для Atmega 328 настройка работы АЦП по прерываниям
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// Глобально
#include <avr/interrupt.h>
#define FIRST_ADC_INPUT 0 //Первый вывод АЦП
#define LAST_ADC_INPUT 3  //Последний вывод АЦП, всего 4
// Voltage Reference: AVCC pin
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR))
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
//Объявляем тип и имена переменных для каждого порта
// и дольнейшей работы с ними
volatile float vlt, amp, ast, tmpr;
 
ISR (ADC_vect) // Работа по прерываниям от АЦП
{
    static unsigned char input_index=0;
    // Read the AD conversion result
    adc_data[input_index]=ADCW;
    // Select next ADC input
    if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
    input_index=0;
    ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index;
    // Delay needed for the stabilization of the ADC input voltage
    _delay_us(10);
    // Start the AD conversion
    ADCSRA|=(1<<ADSC);
}
 
void init_adc() //Настройка АЦП
{
    // ADC 125,000 kHz, AVCC pin
    DIDR0=(1<<ADC5D) | (1<<ADC4D) | (1<<ADC3D) | (1<<ADC2D) | (1<<ADC1D) | (1<<ADC0D);
    ADMUX=FIRST_ADC_INPUT | ADC_VREF_TYPE;
    //ADCSRA=(1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
    ADCSRA=(1<<ADEN) | (1<<ADSC) | (0<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
    ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
}
int main(void)
{
    init_adc(); //Инициализация АЦП
        
    sei(); // Разрешаем прерывания
        
        while (1) 
        {
            // Если тип переменных float 
            vlt= (20.00*adc_data[0]/1023.00); // От 0 до 20-ти
            amp= (15.00*adc_data[2]/1023.00); // От 0 до 15-ти
            ast= (15.00*adc_data[1]/1023.00); // От 0 до 15-ти
            tmpr= ((adc_data[3]*0.73)-273.15);
 
        }
}
0
3 / 3 / 1
Регистрация: 02.04.2018
Сообщений: 172
13.05.2021, 07:43  [ТС] 8
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но у него нет второго АЦП. Или имелось в виду "другой канал"?
а есть ли вообще в природе авр-ки с двумя АЦП? Ну т.е. без мультиплексора?
0
1599 / 823 / 341
Регистрация: 11.10.2018
Сообщений: 4,325
13.05.2021, 08:41 9
Нет.
0
10 / 8 / 2
Регистрация: 17.09.2019
Сообщений: 15
17.05.2021, 16:20 10
Цитата Сообщение от SergeyKagen Посмотреть сообщение
а есть ли вообще в природе авр-ки с двумя АЦП? Ну т.е. без мультиплексора?
В mega и tiny нового поколения не часто, но встречаются 2 ацп, attiny1614 например.
2
1895 / 1213 / 121
Регистрация: 04.01.2010
Сообщений: 4,339
17.05.2021, 18:23 11
Цитата Сообщение от dimkra Посмотреть сообщение
attiny1614
Поблагодарил, не знал. По описанию чип заточен под BLDC или под управление шаговиками (с микрошагом). Архитектура, правда, "мелковата" уже, но, скорее всего, у Microchip'а есть свой туз в рукаве, для чего они его выставили.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2021, 18:23

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

Алгоритм на проверку включения одного многоугольника в другой
Нужно придумать алгоритм сравнения включения одного многоугольника(Пусть будет P2) в другой (P1)...

Составить алгоритм-вычисление квадрата суммы двух чисел и алгоритм для вычисления функции
Здравствуйте!Мне нужно все с самого начала и точно,помогите пожалуйста! 1.составить...

Как связать таймер с АЦП и АЦП с DMA?
Вообщем стоит такая задача: через определенные интервалы времени периодически запускать...

Расширение АЦП микроконтроллера и подключение к АЦП датчиков
Здравствуйте. У меня встала задача сделать устройство для элеватора, для контроля температуры в 864...

Mega16 и неиспользуемый АЦП (питание ацп?)
Если я не использую АЦП контроллера нужно ли подавать на АЦП питание? Если нет, то просто оставить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.