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

Share this post


Link to post
Share on other sites

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

image.png.160e930ba56d5c95b8a4598e971ca593.png

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

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

 

Share this post


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

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

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

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

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

OUTI ADMUX, 0b0110000

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

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

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

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...

  • Similar Content

    • 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), и с внешним без разницы.
      Может у них есть какая то очередность включения?
       

    • By dommax
      Распродаю остатки радиодеталей.
      Для удобного поиска написал WEB страничку http://detali.syremo.com.ua/
      Количество может не совпадать. Пишите - отвечу. Договоримся...
      Отправляю только по Украине. Перед отправкой смогу сделать фото.
  • Сообщения

    • @Sstvov Спасибо большое, думаю, пригодится. Но так как появилась возможность приобрести трансформатор на две обмотки, не будет ли лучше собрать по одной из схем, которые я привёл позже? И если да, то по какой? @Владимир 81 Спасибо, этот тоже тогда попробую  
    • в правом верхнем углу сообщения, нажмите на кнопку - Жалоба и там напишите (в текстовом поле для жалобы) чего хотите, поставив галку напротив - "С этим комментарием все хорошо, но я хочу сообщить о нём модератору". или напишите своё сообщение как обычно, с просьбой переноса, а нажав кнопку жалоба, выберете - "С этим комментарием все хорошо, но я хочу сообщить о нём модератору".
    • В описании должны быть данные на аккумулятор (тип и ёмкость). Если нет, то по марке наушников найти в Инете. Думаю, ток зарядки порядка 100 миллиампер. Поэтому подключить вольтметр к штекеру зарядного и параллельно щупам приткнуть резистор порядка 51…75 Ом мощностью от 0,5 Вт и более. Посмотреть, сколько вольтметр покажет под нагрузкой. Вольт пять должно остаться. Резистор быстро нагреется, но сгореть не успеет. Ну и воспитательную работу в виде запретов и ограничений.
    • Куб практически не шумит ,после включения приходится покрутить регулятор громкости на наушниках что-бы услышать шорох. А вот с нагревом у него беда при номинальном ТП он тепленький а в работе под 70 и выше может разогреться,я ставил тр-ры и кренки на Т-образный профиль около 2 см толщиной от бесперебойника и к нему на проводках все закрепил. Иначе после монтажа не полезть выпаять транзистор. Радиатор крепил вверху профиля. После припаял защиту,питание взял после моста,при этом минус только по питанию,ноль выхода на наушники на плате защиты отделен от нуля питания,иначе петля с шумом. Делал по этой печатке,мне не понравилось зеркальное расположение транзисторов,крепежем вовнутрь.От себя добавил реле по питанию,если в составе усилка использовать и выключать. Для включения ПКН с 3-мя группами,две пары откл по питанию защиту  АС ,одна вкл питание ушника. После ВХ разъема резисторы по 1 Ом 1Вт или предохранители,как удобно. Lehmann Black Qube Linear Light - - c реле БП.lay6.zip
    • Вот, отрывок ролика, где Греф прямо говорит, что если люди перестанут быть придурками, обретут знания- то тогда они сами будут лезть в управление страной. Говорит, что люди должны быть тупым, и необразованным быдлом. На целый ролик я ссылку не буду кидать, можете сами найти.   Образование должно быть только для избранных ДЖИ. Кто ещё помнит откуда это? Нынешнее поколение этого точно не знает.
  • Покупай!

×
×
  • Create New...