• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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 байт Просмотры: 4
Последнее редактирование:

A_D

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

pvvx

Активный участник сообщества
Фильтр Чебышева может попробовать? (хоть это уже и в несколько раз больше по количеству деталей... + Rail-to-Rail ОУ бы надо, хотя бы простой)
К примеру тут https://www.element14.com/community...ecorder-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
Желание врать и выкручиваться от вас исходит от полной безграмотности в радиотехнике и программированию.
Вы и сюда то залезли - не знали как насрать, после уличения вас в очередной лжи :) :)
 
Сверху Снизу