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

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.

 

 

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...