Jump to content
pryanic

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

Recommended Posts

Доброго времени суток. Понадобилось разобраться с АЦП.  Основной материал использовал Евстифеева (микроконтроллеры семейства мега) и учебный курс 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


Антон. Блог

HTPC -> foobar2000 -> SMSL M8A -> Nataly 2012 -> Focal JMLab Tantal 515

Share this post


Link to post
Share on other sites

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

image.png.160e930ba56d5c95b8a4598e971ca593.png

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

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

 


3D модели радиодеталей + макросы

С уважением, Михаил.

Share this post


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

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

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


Антон. Блог

HTPC -> foobar2000 -> SMSL M8A -> Nataly 2012 -> Focal JMLab Tantal 515

Share this post


Link to post
Share on other sites

Время – деньги и наноамперы: применение часов реального времени Maxim Integrated

Зачем использовать внешнюю микросхему часов реального времени (RTC), а не внутренние RTC микроконтроллера? Хотя бы потому, что у RTC MAX31342 производства Maxim Integrated типовое потребление составляет 150 нА при 3 В и температуре 25°С, а у встроенных RTC одного из самых малопотребляющих микроконтроллеров при тех же условиях – примерно 370 нА.

Читать статью

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

OUTI ADMUX, 0b0110000

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


Антон. Блог

HTPC -> foobar2000 -> SMSL M8A -> Nataly 2012 -> Focal JMLab Tantal 515

Share this post


Link to post
Share on other sites
                     

Чип-резисторы Panasonic - технология мягких выводов и сертификация AEC-Q200

Технология мягких выводов чип-резисторов производства компании Panasonic. Обзор серий с оптимизированными параметрами: прецизионных тонкопленочных, токоизмерительных, антисерных, резисторов с повышенной стойкостью к статике и импульсным нагрузкам, резисторных сборок.

Читать статью

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • просто не понимают как работают данные конструкции Смысл объяснять "обезьяне" как стрелять из автомата, хотя в ютубе и такое увидишь Не хочу никого обидеть, но прежде чем садиться писать прошивки сложнее моргания лампочки Сядте, прочитайте основы си и его конструкций. Вопросы снимутся сами собой
    • Можно грешить на кривую плату, но ЯП сделан на той же самой плате. Плату 5350 немного переразвел под ЯП   Отлично. в лс напишу
    • Отличный вариант. Только питание ему нужно организовать хорошее, от 337/317, например.
    • Вот так, да? А Никитин его позиционировал как ТОП, Я УН 5350 собирал отдельно, слушал с простым Никитинским УМ, тоже не очень, грешил что в ДК вместо ВС550 и 560 были 546-556, какие то "левые", все разные. 
    • Сопротивление должно быть таковым, чтоб выходной импеданс был намного ниже входного импеданса звуковой карты. Например у Scarlett focusrite входной импеданс линейного выхода составляет 60 килоом. Если возьмёте переменник на 10 килоом - не прогадаете. Мощность особо не важна. Даже при уровне сигнала в 30 вольт rms, на нём будет выделяться менее чем одна десятая ватта, поэтому самый обычный потенциометр вполне сойдёт. Единственное, что я бы не брал подстроечник, ибо шибко недолговечны они.
  • Similar Content

    • By NicksonWer
      Доброго времени!
      Суть дальнейшего моего повествования связана с наводками на прототипе фотометрического оборудования. Вот фото данного прототипа:


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


      Далее 6 ножка ОУ подаётся на вход ацп микроконтроллера.
      Печатные платы сделаны таким образом, что схема ОУ и фотодиод расположены на одной плате, а микроконтроллера на другой – основной плате. Плата фотодиода разведена таким образом, что вход ОУ имеет земляную петлю, нижняя сторона является общей землёй:

      В целом, эта плата работает нормально. Я ее проверял питая от аккумулятора и сигнал на выходе хороший и чистый.
       
      Проблема сама вот в чём. Что когда всё собрано во едино, а точнее, прототип запитан от внешнего сетевого адаптера от ноутбука, то сигнал превращается в бороду:

      Судя даже по этому показометру, размах равен около 35-40 мв при частоте в 50 Гц.  И когда я просто подношу ладонь к плате фотодиода на расстояние в 20-50 мм, то размах увеличивается уже за 100 мв.
      Тут нужно пояснить вот какой факт. Сейчас я питаю схему ОУ и фотодиода от отдельного аккумулятора (его видно на фото ниже), Так я думал, что питая от общего источника аналоговую часть и цифровую, даёт такой результат.

      Но как показала практика, что питать от аккумулятора, что от общего источника, результат одинаковый.
       
      Как выяснилось, даже если отключить питание от цифровой части (тумблер по положительному полюсу питания), а аналоговая питается от аккумулятора, то на показометре картина остаётся той же, видна та же борода.
      Но если выдернуть провод питания от этой конструкции, то результат на показометре следующий:

      Размах снизился до менее 10 мв и частота увеличилась примерно до 400 Гц. Вероятно тут уже собственные шумы показометра + незначительные наводки на схеме ОУ. Пока писал этот текст включил приборчик, чтобы посмотреть на его показания с отключённым щупом, вот результат:

      Вердикт.
      Проблему в том, что устройство питается от сети. Как побороть эту беду?
      P.s. Есть еще один интересный момент. Когда я пальцем дотрагиваюсь до полигона, но борода исчезает, как будто я действую как-то своей ёмкостью на схему.

      Документ Microsoft Word (2).pdf
    • By artos5
      Приветствую всех на этом форуме!
      Есть необходимость измерять сигнал при помощи данного АЦП. С помощью этого АЦП можно измерять 4 аналоговых не дифференциальных сигнала . Схема следующая:
      Schematic_Temp_opto_sens_V2_20190817124112.pdf
      Картинками с более низким разрешением:
      библиотеку за основу взял эту:
      https://github.com/nsaspook/nidaq700/blob/master/supermoon/example/ADS1220.c
      Путем незначительного допиливания, получилась такая библиотека:
       
      Поправил только эти функции:
      void ADS1220SendByte(unsigned char Byte) { unsigned char Result = 0x01, i=0, flg=0; MOSI_LO; Delay_us(1); for(i=0;i<8;i++) { SCK_LO; //ADC_CLK=0 Delay_us(4); if (flg) MOSI_LO; Delay_us(1); SCK_HI; //ADC_CLK=1 Delay_us(1); if (Byte&Result){ MOSI_HI; flg=1; } else MOSI_LO; Delay_us(4); Result<<=1; } SCK_LO; //ADC_CLK=0 } unsigned char ADS1220ReceiveByte(void) { unsigned char Result = 0, i=0; for(i=0;i<8;i++) { Result<<=1; SCK_LO; //ADC_CLK=0 Delay_us(5); //Delay_us(5); SCK_HI; //ADC_CLK=1 Delay_us(3); if (MISO) Result++; Delay_us(2); } SCK_LO; //ADC_CLK=0 return Result; } И добавил эту функцию:
      void ADS1220Config_MUX_GAIN(uint8_t mux, uint8_t gain) { unsigned Temp; ADS1220ReadRegister(ADS1220_0_REGISTER, 0x01, &Temp); // clear prev value; Temp &= 0x0f; Temp |= gain; Temp |= mux; // write the register value containing the new value back to the ADS ADS1220WriteRegister(ADS1220_0_REGISTER, 0x01, &Temp); ADS1220ReadRegister(ADS1220_1_REGISTER, 0x01, &Temp); // clear prev DataRate code; Temp &= 0x1f; Temp |= (ADS1220_DR_600 + ADS1220_CC); // Set default start mode to 600sps and continuous conversions // write the register value containing the new value back to the ADS ADS1220WriteRegister(ADS1220_1_REGISTER, 0x01, &Temp); } ADS1220.h :
      в результате получаю такую осциллограмму :

      То есть , постоянно считывается 0.
      А вот регистры конфигурации:
      Задаю номер входа MUX и усиление :
       

       
      Читаю данные так:
      ADS1220Config_MUX_GAIN(ADS1220_MUX_0_G, ADS1220_GAIN_1); HAL_Delay(10); temp_[0] = ADS1220ReadData(); Это для 0 канала. 
      Пробовал и так:
      ADS1220SetChannel(ADS1220_MUX_0_G); ADS1220SetGain(ADS1220_GAIN_1); temp_[0] = ADS1220ReadData(); Результат аналогичный. Кто что подскажет? Может кто заметит какой косяк в коде? Уже голова дымит ..
    • 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), и с внешним без разницы.
      Может у них есть какая то очередность включения?
       

×
×
  • Create New...