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

    

MSP430F5438A: АЦП12+ПДП

Привет всем.

Вопрос такой: после работы с АЦП без ПДП не получается работать с АЦП по ПДП. АЦП работает (данные идут в ADC12MEM0 и взводится флаг ADC12IFG0), но данные в буфер не копируются. Если после запуска МК сразу начать работать с АЦП по ПДП, то буфер заполняется.

Как заставить работать АЦП по ПДП после использования АЦП без ПДП?

Инициализация АЦП, частота TB0.0 400 кГц:</p><p>

    mov    #ADC12SHT1_15|ADC12SHT0_1|ADC12ON|ADC12REFON|ADC12REF2_5V,&adc12ctl0;выборка 1024 и 8 тактов
    mov    #ADC12CSTARTADD_0|ADC12SHS_2|ADC12SHP|ADC12DIV_3|ADC12SSEL_3|ADC12CONSEQ_2,&adc12ctl1;ADCClk=5 МГц (от SMClk), повтор с одного канала, запрос от TB0.0
    mov    #ADC12RES_3,&adc12ctl2                        ;12 разрядов
    mov.b    #ADC12SREF_7|ADC12INCH_0 |ADC12EOS,&adc12mctl0
    mov.b    #ADC12SREF_2|ADC12INCH_8 |ADC12EOS,&adc12mctl8
    mov.b    #ADC12SREF_2|ADC12INCH_9, &adc12mctl9
    mov.b    #ADC12SREF_1|ADC12INCH_10,&adc12mctl10
    mov.b    #ADC12SREF_1|ADC12INCH_11|ADC12EOS,&adc12mctl11

Инициализация ПДП:

    clr    &DMACTL4                ;ПДП
    bic    #DMAEN,&dma0ctl    
    bic    #DMAEN,&dma1ctl    
    mov    #DMA0TSEL_19|DMA1TSEL_5,&DMACTL0        ;DMA0 - UCB0TX (vs1011), DMA1 - TB0.0 (формирование синуса)
    mov    #DMA2TSEL_24,&DMACTL1                ;DMA2 - ADC12IFG
    movx.a    #adc12mem0,&dma2sa
    movx.a    #lcz_buffer,&dma2da
    mov    #lcz_buffer_len/2,&dma2sz
    movx.a    #sin_20k_pwm,&dma1sa
    movx.a    #tb0ccr0+2*lcz_20khz_bit,&dma1da
    mov    #sin_20k_pwm_len,&dma1sz</p><p>

sin_20k_pwm - таблица шим-значений для генерации синуса 20 кГц

sin_20k_pwm_len - ее длина (=20)

lcz_buffer - буфер, куда надо складывать значения с АЦП

lcz_buffer_len - его длина (= 5120)

lcz_20khz_bit - номер канала таймера для генерации синуса (=6)

 

Работа с АЦП без ПДП:

Включить ADC12ENC, дождаться установки ADC12IFG, выключить ENC, считать ADC12MEM0 в регистр, считать ADC12IV в регистр, сбросить ADC12IFG (уже танцы с бубном)

Запуск с АЦП по ПДП (режим DMADT_4)

    dint                            ;синхронный запуск АЦП и ШИМ-синуса
    xor    r4,r4
    mov    #DMADT_4|DMADSTINCR_3|DMASWDW|DMAEN|DMAIE,&dma2ctl
    bic    #TBIFG,&tb0ctl
lm_sync_wait:
    bit    #TBIFG,&tb0ctl
    jz    lm_sync_wait
    bis    #ADC12ENC,&adc12ctl0                ;запускаем АЦП
    mov    #DMADT_4|DMASRCINCR_3|DMASBDW|DMAEN,&dma1ctl    ;включаем синус 20 кГц
    bic    #CCIFG,&tb0cctl0+2*lcz_adctimer_channel
    eint

 

 

Поделиться сообщением


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

Сравните "стартовые" состояния для узлов DMA, ADC и UCS когда "идет" и когда "не идет".

(я смотрю в отладчике IAR). Какойнибудь битик завалялся.

Используется ли LPM ? Какой источник для MCLK ?

 

 

 

Поделиться сообщением


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

Сравнивалось. Все одинаково. LPM не использую. MCLK - 25 МГц от FLL, FLL работает от кварца XT2 на 20 МГц.

На e2e нашел мутное описание, что это недокументированный аппаратный косяк.

 

И всплыл еще вопрос:

TB0 работает в режиме вверх-вниз до TB0CCR0. От выхода TB0.0 срабатывает DMA1 для загрузки в TB0CCR6 очередного значения из таблицы (TB0.6 формирует ШИМ-синус). От этого же выхода TB0.0 включен запуск измерения АЦП. И DMA2 работает от ADC12IFG, заполняет буфер считанными с него значениями.

Разрешение работы DMA1 и включение АЦП битом ENC происходит соседними командами при запрещенных прерываниях и сразу после обнуления TB0R.

Почему АЦП иногда(!) пропускает первое значение? Как можно добиться полной синхронности (или с фиксированным сдвигом фаз) работы TB0 и АЦП?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Сравнивалось. Все одинаково. LPM не использую. MCLK - 25 МГц от FLL, FLL работает от кварца XT2 на 20 МГц.

На e2e нашел мутное описание, что это недокументированный аппаратный косяк.

. . .

Думаю, Вы уже смотрели. Если вдруг нет - slaz290t.pdf Errata.

 

". . . происходит соседними командами при запрещенных прерываниях. . ."

Тут может собака порылась. Где-то встречал в док-ии, что в определенных ситуациях

для правильной работы следует добавлять nop.

(Так как у Вас надо заставить работать "в связке" 3 узла ADC, DMA, Timer).

 

 

Поделиться сообщением


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

Вот тут описывается данная тема

https://e2e.ti.com/support/microcontrollers...1429066#1429066

Кое-как предложенным способом получается работать. Пока разбираюсь с синхронной работой ADC+TB0.

 

 

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация