PWM out RTL8710BN

pvvx

Активный участник сообщества
Кто знает, как минимумом внешних деталей улучшить характеристики эмуляции DAC при использовании ШИМ выходов у RTL8710BN? Просто RC цепь не очень…

ШИМ выходы у RTL8710BN стробируются частотой 40 МГц. Если на выходе надо иметь 40 кГц отсчеты, то выходит, что это эквивалентно разрядности DAC в 10 бит (1000 уровней-точек). Это уже более разрядности простого осциллографа и многих нужд.
Главное, что вывод значений каждого цикла PWM обслуживается по DMA и не требует загрузки CPU.

К примеру, выдача пилы из кругового буфера из DMA на GPIO через ШИМ и резистор с конденсатором:
pwm_dma_pila_80kbps.gif
(Шумы от USB и не согласовывал щупы по GND, да всё на соплях... ШИМ период 500 точек, что примерно равно DAC 9 бит 80 кГц. Цикл вывода по DMA 1000 точек.)
Наблюдаем искажения созданные RC цепью и GPIO выходом у уровней около GND и +3.3В.
Но всё равно линейность лучше чем у DAC ESP-32 :)
 

Вложения

  • 958 байт Просмотры: 3
Последнее редактирование:

A_D

Active member
Фильтр Чебышева может попробовать? (хоть это уже и в несколько раз больше по количеству деталей... + Rail-to-Rail ОУ бы надо, хотя бы простой)
К примеру тут https://www.element14.com/community/docs/DOC-31050/l/atmel-avr335-application-note-on-using-digital-sound-recorder-with-tinyavr-or-megaavr-and-dataflash пример (7я страница) из второго порядока + RC на выходе еще дополнительно ставят, для звука.
 

pvvx

Активный участник сообщества
Фильтр Чебышева может попробовать? (хоть это уже и в несколько раз больше по количеству деталей... + Rail-to-Rail ОУ бы надо, хотя бы простой)
К примеру тут https://www.element14.com/community/docs/DOC-31050/l/atmel-avr335-application-note-on-using-digital-sound-recorder-with-tinyavr-or-megaavr-and-dataflash пример (7я страница) из второго порядока + RC на выходе еще дополнительно ставят, для звука.
Это "много деталей" = "много буков" :)
Тут и так 0..3.3V выход, а точность равна источнику питания и выше 9 бит смысл теряется.
Т.е. выход в 8 бит - для более надо аналоговое питание и прочие костыли.
Для звука есть другие методы - т.к. у нас DMA то надо применять другой метод кодирования, как в HiFi :) DSD — Википедия
И DSD у нас до 40 МГц.
Прием длительности по DMA тоже есть. Совместно с PWM это дает возможность построения тучи вариантов измерений...
С помощью парочки RC деталей можно слепить ADC, с линейностью более чем у ESP-32, но у RTL"B" есть встроенные ADC с более менее характеристиками...

Дискретность в 40МГц PWM и измерения длительностей внешнего цифрового сигнала (i/o) с DMA позволяет построить приличный измеритель температуры на 1N4001 диоде, не используя ADC/DAC. Но требуется калибровка... Может и возможна авто-калибровка... (но это уже уровень патента :) )
Основа там обратное сопротивление выпрямительного диода с неубитым примесями времени восстановления – “рассасывания заряда”, что есть прямое время рассеивания температуры нагрева (возбуждения атомов) кристалла диода полученного при импульсе прямого тока до насыщения (“инжекции заряда” и последующего времени рассеивания “плазмы” с детектированием в кристалле, что есть время до лавинообразного фронта восстановления обратного сопротивления после переключении направления тока на диод, напрямую зависящее от внешней температуры и ...)…
 
Последнее редактирование:

pvvx

Активный участник сообщества
По умолчанию на PWM используется круговой одиночный буфер DMA с автоматическим перезапуском и прерывание не дает.
Если надо переключать буфера DMA, то надо модифицировать процедуру установок DMA на выдачу прерывания по окончанию передачи буфера, но она находится в ROM-BIOS чипа.
Замещение:
Код:
#include "ameba_soc.h"
#include "main.h"

extern u32 PWM_GDMA_HSx[6];

u32 _RTIM_TXGDMA_Init(u32 TIM_Channel, GDMA_InitTypeDef *GdmaInitStruct, void *CallbackData, IRQ_FUN CallbackFunc, u8* pDataBuf, u32 DataLen)
{
  int result = 0;
  u8 ch_num = GDMA_ChnlAlloc(1, (IRQ_FUN)CallbackFunc, (u32)CallbackData, 32); // GDMA1
  if(ch_num == 0xff) {
      DBG_8195A_HAL("%s\r\n", __func__);
  } else  {
    memset(GdmaInitStruct, 0, sizeof(GDMA_InitTypeDef));
    GdmaInitStruct->GDMA_DstHandshakeInterface = PWM_GDMA_HSx[TIM_Channel];
    GdmaInitStruct->GDMA_SrcAddr = (u32)pDataBuf;
    GdmaInitStruct->GDMA_DstAddr = TIMER_REG_BASE + 0x160 + TIM_Channel * sizeof(u32);
//    GdmaInitStruct->MuliBlockCunt = 0;
//    GdmaInitStruct->GDMA_SrcMsize = 0; // MsizeOne
//    GdmaInitStruct->GDMA_DstMsize = 0; // MsizeOne
//    GdmaInitStruct->GDMA_SrcInc = 0; // IncType;
//    GdmaInitStruct->GDMA_ReloadDst = 0; // 0 : disable / 1 : enable
//    GdmaInitStruct->GDMA_ReloadSrc = 0; // 0 : disable / 1 : enable
    GdmaInitStruct->GDMA_IsrType = TransferType | ErrType;
    GdmaInitStruct->GDMA_BlockSize = DataLen >> 2;
    GdmaInitStruct->MaxMuliBlock = 1; // 0 : disable / 1 : enable
    GdmaInitStruct->GDMA_DIR = TTFCMemToPeri;
    GdmaInitStruct->GDMA_SrcDataWidth = TrWidthFourBytes;
    GdmaInitStruct->GDMA_DstDataWidth = TrWidthFourBytes;
    GdmaInitStruct->GDMA_DstInc = NoChange;
    GdmaInitStruct->GDMA_Index = 1; // GDMA1
    GdmaInitStruct->GDMA_ChNum = ch_num;

    GDMA_Init(1, GdmaInitStruct->GDMA_ChNum, GdmaInitStruct);
    GDMA_Cmd(GdmaInitStruct->GDMA_Index, GdmaInitStruct->GDMA_ChNum, ENABLE);
    result = 1;
  }
  return result;
}

// ---Пример pin-pong буфера DMA
volatile u32 dma_count;
void tim5_gen_dma_ISR(void *Data)
{
    PGDMA_InitTypeDef GdmaStruct = (PGDMA_InitTypeDef)Data;
    dma_count++;
    if(dma_count & 1) GdmaStruct->GDMA_SrcAddr = (u32)адрес_второго_буфера;
    else GdmaStruct->GDMA_SrcAddr = (u32)адрес_первого_буфера;
    GDMA_Init(GdmaStruct->GDMA_Index, GdmaStruct->GDMA_ChNum, GdmaStruct);
    GDMA_Cmd(GdmaStruct->GDMA_Index, GdmaStruct->GDMA_ChNum, ENABLE);
   // ... заполнить свободный буфер и отдать семафор основному процессу заполнения буферов DMA...
}

//... старт с назначением прерывания по передаче буфера
    _RTIM_TXGDMA_Init(pwm_chan, &TIMGdmaInitStruct, &TIMGdmaInitStruct, (IRQ_FUN)tim5_gen_dma_ISR, (u8*)адрес_первого_буфера, PWM_PERIOD);
 

pvvx

Активный участник сообщества
pvvx, спрашивает не потому, что ему действительно интересен Ваш ответ.
Ему просто нужен "козел отпущения", чтобы на Вашем ответе показать, что Вы ничего не знаете и вновь блеснуть знаниями из интернета заодно и нагадить ненароком на собеседника.
А что взято из интернета в прошлых сообщениях?
Подтвердите свои доводы.
Если у вас проблемы с головой и не видите технического описания почему нет смысла городить огород на выходе PWM у модуля, то тут помочь сложно и муторно.
 
Последнее редактирование:

A_D

Active member
Это "много деталей" = "много буков" :)
Тут и так 0..3.3V выход, а точность равна источнику питания и выше 9 бит смысл теряется.
Т.е. выход в 8 бит - для более надо аналоговое питание и прочие костыли.
Для звука есть другие методы - т.к. у нас DMA то надо применять другой метод кодирования, как в HiFi :) DSD — Википедия
И DSD у нас до 40 МГц.
Прием длительности по DMA тоже есть. Совместно с PWM это дает возможность построения тучи вариантов измерений...
Несколько тогда не понял, а что требуется то от RC цепи? Что улучшить хотелось бы, если точнее вопрос... "наплыв"-неравномерность некоторую насколько смог разглядеть по осциллограмме "при плавном выходе" с обоих концов диапазона условного ЦАП - это проблема к решению?
ЗЫ, Сейчас просто в отпуске, в Москве, неделю прибываю... потому толком и не смотрю форум, да и подсказать ограниченно могу..
 

pvvx

Активный участник сообщества
Несколько тогда не понял, а что требуется то от RC цепи? Что улучшить хотелось бы, если точнее вопрос... "наплыв"-неравномерность некоторую насколько смог разглядеть по осциллограмме "при плавном выходе" с обоих концов диапазона условного ЦАП - это проблема к решению?
ЗЫ, Сейчас просто в отпуске, в Москве, неделю прибываю... потому толком и не смотрю форум, да и подсказать ограниченно могу..
На краях кривая. Не хватает току выходов при средних номиналах RC. Увеличение R ведет к большому выходному сопротивлению и падении напряжения на нагрузке и сложности в согласовании. Джиттер тоже достаточный, а может нагрузочные хар-ки по току вывода на разных полярностях фронтов. Нестабильность питания так-же большая из-за большой разницы пиков потребления модуля при работе. Возможно внешний коммутатор исправит дело... Но это опять костыль. Как сделать проще и выудить серединку по всем хар-кам пока не знаю. Не хватает измерений и пока нет нужды в применении.
Для звука, процедура перекодировки в DSD или что-то похожее, достаточно прожорливая и CPU может не успеть перекодировать PCM в буфера DMA. Надо искать оптимум по каждому параметру, а без реальной задачи это пока не интересно.
 
Последнее редактирование:

pvvx

Активный участник сообщества
ВЫ вопрос задали про RC цепочку риторический ( т е ламерский)
объясняю подробно почему так
Потому-что ответ на вопрос "Что лучше фильтрует пассивной RC-цепи " есть очевидные два ответа 0 либо две RC цепи либо активный фильтр.
Чел написал Вам вариант 2 ( какой фильтр это не важно не знаю почему он выбрал чебышева)
Вот и скажите - зачем спрашивать, если ответ известен?
Вопрос по схемотехнике и какие детали поставить из наиболее доступных и дешевых.
Например некоторые микросхемы для простого пользователя стоят как R и C.
Т.е. вопрос на смекалку и альтернативные решения, а не на ваше типовое мышление.
И вопрос адресован не вам, а тем кто уже мучался с такими вопросами и нашел какую более менее простую практическую реализацию, пусть даже с использованием компонентов не по назначению. Про что и было уточнено в ответе A_D, что вопрос не теоретический, а практический к конкретным параметрам и имеющимся условиям на GPIO модуля.
Как пример - некоторые простые лог. микросхемы имеют и триггер и выход источником тока. На них можно подать отдельный CLK для уменьшения джиттера, запитать их через 10 Ом 100 мкФ и получить более линейный выход ШИМ.
И вопрос не в ШИМ вообще, а как применить имеющуюся аппаратную связку DMA + PWM GPIO для вывода разных аналоговых сигналов. Т.е. какая есть альтернатива с малыми затратами и малой ценой, дающая более качественные сигналы на данной связке?
PS: А пока вы превращаетесь в =AK=, влетающего в любую тему и без разбора вопроса пишущего всякую хрень, которую знает любой и совершенно не подходящую к вопросам темы.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Что я слышу!!! Вы заговорили про малую цену решений?
Когда читаю Ваши посты то возникает ощущение что возишься в помойке.
Одновременно и интересное есть и говна много.
у Вас желание хамить это от недостатка воспитания или же неустранимая генетическая предрасположенность?
:) :)
Малая цена решений возникает не от цены на комплектацию :p
Желание врать и выкручиваться от вас исходит от полной безграмотности в радиотехнике и программированию.
Вы и сюда то залезли - не знали как насрать, после уличения вас в очередной лжи :) :)
 
Сверху Снизу