pryanic

Не получается получить данные с АЦП

5 posts in this topic

pryanic    629

Доброго времени суток. Понадобилось разобраться с АЦП.  Основной материал использовал Евстифеева (микроконтроллеры семейства мега) и учебный курс Di-Halt.

На первый раз задача простая - обработать напряжение с переменного резистора и послать по UART в терминал. С терминалом уже кое-что делал, так что тут вряд ли косяк есть.

Кратко опишу программу: каждую секунду в обработчике прерывания таймера (не совсем точно, прерывание по переполнению Т0) запускаю преобразование АЦП установкой в 1 бита ADSC. 

В обработчике прерывания АЦП читаю байт ADCH (выравнивание по левому краю ADLAR=1) и шлю по уарт. Но в терминал приходят одни FF независимо от положения движка потенциометра (подключен к PC1 средним контактом, крайними на землю и AVCC)
 

Скрытый текст

 

            .include        "m8def.inc"
            .include "macrobaselib.inc"   


            .equ     XTAL = 8000000     
            .equ     baudrate = 9600  
            .equ     bauddivider = XTAL/(16*baudrate)-1

            .def    temp    =    R16
            .def    ADCdata    =    R20

;= Start     macro.inc ========================================

;= End         macro.inc ========================================

; RAM ========================================================
        .DSEG


; FLASH ======================================================
            .cseg
            .org    0
            rjmp RESET                         ; Reset Handler
            rjmp EXT_INT0                     ; IRQ0 Handler
            rjmp EXT_INT1                     ; IRQ1 Handler
            rjmp TIM2_COMP                     ; Timer2 Compare Handler
            rjmp TIM2_OVF                     ; Timer2 Overflow Handler
            rjmp TIM1_CAPT                     ; Timer1 Capture Handler
            rjmp TIM1_COMPA                 ; Timer1 CompareA Handler
            rjmp TIM1_COMPB                 ; Timer1 CompareB Handler
            rjmp TIM1_OVF                     ; Timer1 Overflow Handler
            rjmp TIM0_OVF                     ; Timer0 Overflow Handler
            rjmp SPI_STC                     ; SPI Transfer Complete Handler
            rjmp USART_RXC                     ; USART RX Complete Handler
            rjmp USART_UDRE                 ; UDR Empty Handler
            rjmp USART_TXC                     ; USART TX Complete Handler
            rjmp A_D_C                         ; ADC Conversion Complete Handler
            rjmp EE_RDY                     ; EEPROM Ready Handler
            rjmp ANA_COMP                     ; Analog Comparator Handler
            rjmp TWSI                         ; Two-wire Serial Interface Handler
            rjmp SPM_RDY                     ; Store Program Memory Ready Handler

; Interrupts ==============================================

EXT_INT0:    nop
            reti             
EXT_INT1:    nop
            reti                 
TIM2_COMP:    nop
            reti             
TIM2_OVF:    nop
            reti             
TIM1_CAPT:    nop
            reti         
TIM1_COMPA:    nop
            reti              
TIM1_COMPB:    nop
            reti              
        
TIM0_OVF:    nop                        
            reti              
SPI_STC:    nop
            reti              
            
USART_UDRE:    nop
            reti
USART_RXC:    nop        
            reti                
USART_TXC:    nop
            reti              
                 
EE_RDY:        nop
            reti                  
ANA_COMP:    nop
            reti                  
TWSI:        nop
            reti                     
SPM_RDY:    nop
            reti  

TIM1_OVF:    PUSHF

            setb    ADCSRA,    ADSC
;            OUTI    ADCSRA,(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)        
            POPF
            reti 
            
            
A_D_C:        PUSHF
            in        ADCdata,    ADCL
            in        ADCdata,    ADCH


uart_snt:    SBIS     UCSRA,    UDRE    
            RJMP    uart_snt     
            OUT        UDR,     ADCdata    
            POPF    
            reti      

; End Interrupts ==========================================


Reset:       STACKINIT    ; Èíèöèàëèçàöèÿ ñòåêà
            RAMFLUSH    ; Î÷èñòêà ïàìÿòè
            GPRFLUSH    ; Î÷èñòêà ÐÎÍ     


; End coreinit.inc

; Internal Hardware Init  ======================================
            outi    ddrb,    0xFF
            outi    portb,    0x00

uart_init:    LDI     R16, low(bauddivider)
            OUT     UBRRL,R16
            LDI     R16, high(bauddivider)
            OUT     UBRRH,R16

            LDI     R16,0
            OUT     UCSRA, R16

            
            LDI     R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
            OUT     UCSRB, R16    

            ; Ôîðìàò êàäðà - 8 áèò, ïèøåì â ðåãèñòð UCSRC, çà ýòî îòâå÷àåò áèò ñåëåêòîð
            LDI     R16, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
            OUT     UCSRC, R16


; ADC Init - Èíèöèàëèçóðåì ÀÖÏ.

            OUTI    ADCSRA,(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)
             OUTI    ADMUX,0b0110001

Timer1_1S:    clr        temp
            out        tcnt1h,    temp
            out        tcnt1l,    temp
;            ldi        temp,    0xFF
;            out        ocr1bh,    temp
;            out        ocr1bl,    temp    
            outi    tccr1b,    (1<<CS12)
            setb    TIMSK,    TOIE1
            setb    tccr1a,    com1a0
            setb    SFIOR,    PSR10

            SEI

; Main =========================================================
Main:    nop
        nop
        nop
        nop

        RJMP    Main
; End Main =====================================================


; Procedure ====================================================

; End Procedure ================================================


; EEPROM =====================================================
            .ESEG                ; Ñåãìåíò EEPROM

 

 

ADC_test.zip

Share this post


Link to post
Share on other sites
aitras    1546

В железе собрано? У меня в Протеусе что-то меняется при вращении потенциометра:

image.png.160e930ba56d5c95b8a4598e971ca593.png

Кстати, такая запись не установит бит в ноль: (0<<TXCIE). В ноль устанавливается иначе, с использованием инверсной маски:

REG |=  (1 << BIT)			// Установка бита в 1
REG &= ~(1 << BIT)			// Установка бита в 0

 

Share this post


Link to post
Share on other sites
pryanic    629
3 часа назад, aitras сказал:

В железе собрано? У меня в Протеусе что-то меняется при вращении потенциометра:

Да, в железе-то одни FF и идут. Причем независимо от того подключен резистор к входу АЦП или нет(

Share this post


Link to post
Share on other sites

Старт складской программы по Wi-Fi/ Bluetooth-чипам от Espressif

На склад КОМПЭЛ поступили чипы, модули и отладочные платы от компании Espressif Systems на базе ESP8266 и ESP32. Стоимость всех изделий данной линейки – в 2-3 раза ниже ближайших аналогов, чипы занимают минимальное место на плате, энергоэффективны и универсальны в применении

Подробнее...

pryanic    629

Хм, вроде бы обнаружил косяк!  В инициализации АЦП

OUTI ADMUX, 0b0110000

Не хватает еще нуля в конце. Поэтому и запись в регистр проходила некорректно. Бит ADLAR устанавливался в 1, а REFS0 так и оставался 0. Получалось что опорное напряжение должно подаваться с внешнего ИОНа. Но проверю в железе уже завтра)

Share this post


Link to post
Share on other sites

Вебинар Литиевые ХИТы FANSO или что нужно знать инженеру о батарейках»

20 июня компания Компэл приглашает всех желающих принять участие в вебинаре, посвященном литиевым батарейкам FANSO. На вебинаре будет рассказано о параметрах батареек, их зависимости от режима работы и эксплуатации. Будет дана информация о том, на какие параметры следует обращать внимание, выбирая литиевый ХИТ, и как избежать некоторых проблем.

Подробнее...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Similar Content

    • By maxssau
      Продам адаптеры USB-I2S. 

       
      Возможности:
       
      стерео ввод/вывод PCM 16-32 бита, 44.1-384 кГц. Ввода DSD нет, как и драйверов для ввода DSD.
      вывод DSD в режиме DoP 64-128, в режиме Native 64-256. Native доступен в Linux без "хитрых" драйверов.
      Тактирование от платы ЦАП/АЦП, частоты 512 fs (22.5792/24.576 МГц). Теоретически возможно и 1024fs(скорости 768кГц и DSD512 Native), но это не опробовано.
      Гальваническая изоляция на Si8662/Si8640.
      Питание возможно как Self так и Bus Powered. В режиме Bus Powered необходимо самостоятельно позаботиться о мастерклоке, т.к. возможны сильные глюки при выключенном генераторе мастерклока.
       
      Тема: 
      срок изготовления 3-5 недель (сильно зависит от поставок процессоров).
      На данный момент полностью реализован интерфейс Legacy. Для отладки Native режима пока нет платы ЦАП, в процессе разработки, будет не раньше осени.
      Цена 6000 + пересылка (в среднем 250 р.).
    • By dav1977
      Кто-нибудь запускал скоростные  АЦП  AD7606(последовательного приближения)
       в последовательном режиме считывания данных ?,
      из 4 шт одна заработала, остальные на выводе последовательного вывода DOUT ничего не выдают постоянно 0.
      пробовал переключаться с внутренним опорным источником(выдает 2.49), и с внешним без разницы.
      Может у них есть какая то очередность включения?
       

    • By dommax
      Распродаю остатки радиодеталей.
      Для удобного поиска написал WEB страничку http://detali.syremo.com.ua/
      Количество может не совпадать. Пишите - отвечу. Договоримся...
      Отправляю только по Украине. Перед отправкой смогу сделать фото.
    • By maxssau
      День добрый!
      Сегодня хотелось бы раcсказать о своей разработке - АЦП AD-01 на преобразователе от Cirrus Logic CS5381.
      Целью данной разработки было получение близких к даташитным параметрам характеристики АЦП, при этом плату имеющeю не высокую стоимость и универсальность.
      На данный момент это уже третья версия платы. Первая версия была сделана ЛУТом, для отработки схемотехники АЦП. Далее последовала вторая версия на заводских платах:

      Схемотехника была взята полностью из даташитов. Стандартное включение CS5381, стабилизаторы питания в цифровой части AMS1117-3.3, в аналоговой из серии TPS7A.
      Схемотехника входного буфера взята из даташита на OPA1632.
      После опробования данной платы, были выявлены некоторые недочеты и разработана третья версия версия:

       
      Входной буфер сделан для 2х вариантов: с конденсатором и без, для чего на ПП предусмотрены соответствующие площадки.

      Топология такого буфера позволяет без переделок проводить замеры/запись как балансного сигнала так и не балансного, достаточно вывод 3 посадить на землю (2). Это достаточно удобно, для различных типов сигнала достаточно иметь 2 пары кабелей с различной распайкой.
      Питание аналоговой части сделано на малошумящих стабилизатора TPS7A4901 и TPS7A3001.

      Питание цифровой части на 2х AMS1117-3.3В, схему нет смысла приводить, она из даташита на стабилизаторы.
      На плате всего 1 генератор на 512fs (24.576 Мгц). Такая частота выбрана не случайно, для работы SPDIF передатчика необходимо иметь частоту мастерклока не ниже 256fs для работы на частоте 96к, я использую передатчик на WM8805 (о этой плате чуть ниже). В качестве интерфейса на компьютере я использую ЗК E-MU 0404 PCIe.
      Полная схема преобразователя:

      На плате присутствует место под DIP переключатель, для настройки режимов работы АЦП. Выход АЦП - I2S, уровни 3.3В.
      Для соединения с компьютером была разработана плата SPDIF интерфейса SI-01.

      Схему приводить особого смысла нет, она повторяет даташитную для WM8805 включенным в HW режиме. В этом режиме есть определенные ограничения, связанные с работой PLL, поэтому максимальная частота приёма/передачи ограничена в 96к. WM8805 позволяет работать как в Master режиме, так и в Slave, что очень удобно. Выбор режима осуществляется установкой джампера. Так же на плате присутствуют джамперы выбора питания, от ЦАП или АЦП. В качестве выходного буфера для передатчика используется 1G125.
       
      Шумовая полка:

      В качестве источника питания пара трансформаторов с стабилизаторами 317/337, даже имея ёмкости в 10000 мкФ полностью подавть 50Гц и гармоники пока не удалось, возможно проблема в корпусе и компоновке.
      Замер моего ЦАПа на 4490, к сожалению не обошлось без земляных петель, поэтому присутствует шум на уровне -125дБ и ниже.

       
      Есть определенные особенности применения ИМС CS5381, скупо описанные в App Notes, позволяющие реализовать данную ИМС в двойном моно и теоретическим уровнем THD+N в -123дБ, что позволит производить оценку и замеры искажений у большинства современных ИМС ЦАП без режекторов.
      В проекте плата с 2мя генераторам на сетки частот 44.1 кГц и 48 кГц, АЦП включенным в моно режимах и DSP процессором ADAU1452.
      Подробную инструкцию с описание на текущую схемы и платы прикладываю.
      инструкция.pdf
    • By freebits
      Добрый день.
      Реализовал получение и обработку аналогового сигнала как в данной статье -> ссылка. Т.е. используется внутреннее опорное напряжение 2,56 Вольта, прием через прерывания, а на дисплее выводится числовое значение напряжения, которое присутствует на входе АЦП - нога ADC6.
      В обработчике прерывания считываются значения из регистров ADCL и ADCH, из которых формируется значение переменной adc_value. В теле программы данное значение АЦП преобразуется в значение напряжения, посредством деления adc_value на 400. Затем полученный результат выводится на дисплей.
      Проблема в том, что выводимое значение не стабильно и скачет в диапазоне +/- 300 мВ. Т.е. если к аналоговому входу приложено напряжение 1,4 вольта, то на дисплее значения будут хаотично меняться в диапазоне от 1,1 Вольт до 1,7 вольт, т.е. весьма ощутимый разброс в сотни милливольт. При этом если смотреть сигнал на входе осциллографом, то по факту нет такой картины - максимальный разброс (Vpp) составляет несколько десятков милливольт, но никак не сотен. Даже если этот вход посадить на землю, все равно на дисплее будут хаотичные значения доходящие до 0.4 вольта. Откуда он берет такие цифры на понятно.
      Подскажите, в чем может быть проблема и как получить стабильные показания, хотя бы до сотен милливольт?
      unsigned int adc_value; char high_adc=0, low_adc=0; ISR(ADC_vect) //обработчик прерывания ADC_vect { low_adc = ADCL; high_adc = ADCH; //Верхняя часть регистра ADC должна быть считана последней иначе не продолжится преобразование adc_value = high_adc * 256 + low_adc; //значение АЦП } void ADC_Init(void) //инициализация АЦП { ADCSRA |= (1<<ADEN) // Разрешение использования АЦП |(1<<ADSC) //Запуск преобразования |(1<<ADATE) //Непрерывный режим работы АЦП |(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)//Делитель 128 = 64 кГц |(1<<ADIE); //Разрешение прерывания от АЦП ADMUX |= 0b11000110; //Внутренний Источник ОН 2,56В вход ADC6 } void main(void) { float n = 0; while(1) { n = (float) adc_value / 400; // преобразование значения АЦП в напряжение /* Отправка на дисплей */ _delay_ms(2); } }  
  • Сообщения

    • А я не стал запариваться, чтобы не откладывать и сделал побыстрей -  параллелил туалет с ванной. Удобно тем, что тащить провод нужно только от туалетной лампы.   Лампочки светодиодные, совсем мизер жрут. В туалете 8 вт, а в ванной чуть больше. Года три работает и дорабатывать уже и в мыслях нет. А сначала тоже хотел релюху поставить для развязки.
    • с точки зрения потерь амплитуды на ключах TL494, немного получше будет, если сделать наоборот - npn внешние повторители наверху, а TL494 - ОЭ внизу. Потери в режиме ОЭ у ТЛ494 будут на 0,7-1В ниже, чем в режиме ОК. Амплитуда сигнала на затворах также будет выше. В остальном, схема работает аналогично. Мостик надо делать не из FR и тем более, не из выпрямительных диодов, а только из Шоттки. И не обязательно мостик. В моем варианте понадобилось шунтирование только верхних ключей.  
    • Ну, я на съёмках не присутствовал, вам виднее, но на этом фото, даже если присмотреться, локти согнуты как положено, ладони вперёд, а живота, а тем более позвоночника, за волосами вообще в упор не видно.
    • 6000 пара вместе с отправкой.
    • Вячеслав, я в который раз читаю вашу статью...  прочитал так же ваши статьи по поводу обратных связей. И вот какое интересное наблюдение заметил, на данном графике вы по сути сравнили тетрод, у которого нет обратных связей, с псевдотриодным включением у которого 100% ОС, ул с 40% ОС, и КФБ 25% ОС при чем в триодном включении. В связи с тем возникает вопрос, почему вы не сделали более корректного сравнения, допустим тетрод с ООС 20-40%, возможно так было бы все иначе, или с катодной обмоткой но в тетроде включении?
    • К примеру УНЧ Technics SU-8044, заявленый диапазон: Frequency response: 10Hz to 50kHz. А Technics SU-8 так вообще 10Hz to 120kHz. И зачем тянуть до 50кГц, если большинство и 20кГц не слышат. То ли дело совковый ширпотреб, который всё для народа, 16кГц - и хватит.
      Прописные истины, что дает более широкий ЧД для качества звучания УНЧ, я не собираюсь Вам объяснять. Здесь форум, а не школа ЮТ. Гугл в помощь. Это Вы прикалываетесь или и вправду не знаете стандартный набор измеряемых параметров УНЧ. Загляните в инструкцию к своему самому честному УНЧ, если он заводской сборки, там все есть.

      Я, по мимо измерения параметров самодельного УНЧ, оцениваю звучание по принципу нравится-ненравится. Но ведь меня и не особо интересует честно или не очень усиливает УНЧ. И тем товарищам, которые забирают себе сделанные мной усилители, важно именно нравится как звучит или не нравится.
      А как Вы определяете честность усилителя, что является эталоном?