ШИМ

porex

New member
Не могу разобраться с ШИМ. Взял пример webserver'a от pvvx, добавил настройку ШИМа
Код:
struct pwm_param pwmcfg;
   pwmcfg.freq=1000;
   pwmcfg.duty[0]=100;
   pwm_init(pwmcfg.freq,pwmcfg.duty);
   /*pwm_set_freq(100);
   pwm_set_duty(100,0);*/
   pwm_start();
покапался немного в драйвере pwm.c, но чуда не призошло, ШИМ на ножке GPIO2 не появился. Плата ESP-01.
Может у кого есть рабочий пример с ШИМ?
 

pvvx

Активный участник сообщества
У меня нет программного ШИМ от Espressif, использующего прерывания таймера и программно переключающего ножки с большим джиттером и очень низкочастотного. Это в примере IoT, pwm.c.
У меня дан пример аппаратного ШИМ, встроенного в чип, на 312kHz в Web_base\app\driver\sigma_delta.c.
http://esp8266.ru/forum/threads/raz...go-webservera-na-esp8266.56/page-12#post-1823
И всё работает - http://192.168.4.1/web.cgi?gpio2.sgs=0x80 (0x80 - скважность 1:1 - меандр)
Получаем на GPIO2 312kHz:
gpio2sgs.gif
Изменить скважность http://192.168.4.1/web.cgi?gpio2.sgn=x, где x от 0 до 255 (в HEX или DEC). Отключить и вернуть вывод GPIO2 в стандартное для SDK состояние = http://192.168.4.1/web.cgi?gpio2.sgс=x, где x любое число.
Управление gpio2.sg_ может быть вставлено в текст HTML или cookie, или Java, или POST... вообщем в любую стандартную передачу параметров для HTTP.
Пример на CИ писать грешно :) т.к. всё управление описано Web_base\app\include\driver\sigma_delta.h
Код:
void sigma_delta_setup(uint32 GPIO_NUM);
void sigma_delta_close(uint32 GPIO_NUM);
void set_sigma_duty_312KHz(uint8 duty);
 
Последнее редактирование:

porex

New member
Спасибо за подсказку, не знал о существовании аппаратного ШИМ. Судя по описанию регистров он одноканальный?
Разбираюсь с вашим драйвером и не могу понять зависимость частоты ШИМа, от заполнения и предделителя. Формула, приведенная в функции set_sigma_duty_312KHz, справедлива только для заполнения кратному степени двойки. Если вводится произвольное заполнение, то частота получается отличной от 312,5kHz плюс импульсы идут пачками.
 

pvvx

Активный участник сообщества
Спасибо за подсказку, не знал о существовании аппаратного ШИМ. Судя по описанию регистров он одноканальный?
С каналами там никак - один источник и любые GPIOx. Описание в gpio_reg.xlsx http://esp8266.ru/forum/attachments/esp8266_reg-xlsx-zip.167/
Разбираюсь с вашим драйвером и не могу понять зависимость частоты ШИМа, от заполнения и предделителя. Формула, приведенная в функции set_sigma_duty_312KHz, справедлива только для заполнения кратному степени двойки. Если вводится произвольное заполнение, то частота получается отличной от 312,5kHz плюс импульсы идут пачками.
А это не совсем моё. Я только адаптировал инициализацию и другие мелочи :)
Сложности с установками GPIO по причине "жалко памяти RAM". Иначе все таблицы линкуются в RAM и отжирают и так малую память... А методой в исходнике всё находится в flash и не использует RAM :)

Частота нарушается при крайних значениях...

Про начальный исходник http://esp8266.ru/forum/threads/raz...go-webservera-na-esp8266.56/page-12#post-1810
 
Последнее редактирование:

porex

New member
Регистры gpio уже видел, спасибо.
У меня осциллограф показывает стабильную частоту 312,5 kHz, только с заполнением кратным 2. При любом другом частота прыгает, но похоже это связано из-за того что импульсы идут пачками. У вас такое не наблюдается?
Во вложении ШИМ с заполнением 0x66
IMG_20150313_160453_.jpg
Кстати reference manual'а для чипа нет никакого?
 

pvvx

Активный участник сообщества
Кстати reference manual'а для чипа нет никакого?
Неа - всё "методом тыка".
С аппаратным ШИМ много неясностей - никто его не исследовал и никаких записей в инет не найдено, кроме того, что нашел у себя в компе тот исходник :). Где-то прочитал его, когда только пришли первые модули и пытался беспорядочно собрать по чипу инфу (накачал несколько гегов всего что попадалось с названием ESP8266 :) - теперь это никчемный хлам). Счас его что-то не найти в google и т.д. :(
Вот такой cигнал при http://192.168.4.1/web.cgi?gpio15.sgs=0x81
pwm_0x81.gif
При 0x66:
pwm_0x66.gif
При 0x01 и 0xFF импульсы 12.5 нс, период 3.2us
Надо разобраться с prescale и duty... WEB умеет писать в регистры... в hexdamp...
Можно и запустить через Web произвольную call с тремя параметрами (в новее версии, если надо сменю web-помойку ) :)
 
Последнее редактирование:

porex

New member
Я уже подредактировал по свои нужды код)) Есть кое-какие мысли по поводу зависимости, надо проверить, но что-то последнее время модуль отказывается выдавать хоть какие-нибудь импульсы. При подключении пина к сигма-дельта, напряжение на нем падает до 1.6 В и тишина. Причем на 0 и 2 пине картина одинаковая. ШИМ сломался?)))
 

porex

New member
Пациент оказался жив, осциллограф погоду показывал))
Провел небольшое исследование. Включил ШИМ /web.cgi?gpio2.sgs=0x80, осциллограф показал частоту 312.5 кГц, далее добавил функцию аналогичную set_sigma_duty_312KHz, но изменяющую только заполнение(duty). Заметил такую закономерность, что при любом значении duty, ширина импульса остается постоянной и равна 1600 ns, при изменении duty меняется только период импульсов. Такое ощущение, что duty и prescaler перепутаны местами, надо бы проверить. Из этого исследования получилась формула расчета часты ШИМ: f(pwm)=80 MHz/2(возможно внутренний делитель)/(prescaler+1)/128(максимальное значение duty)*duty(текущее значение). Надо еще попробовать задать duty больше 128.
Правда пока не могу объяснить следование импульсов пачками.
 

porex

New member
Мы здесь с аппаратным ШИМом воюем), но спасибо за наводку, посмотрим чего они там натворили.
 

pvvx

Активный участник сообщества
Там очень низкочастотный программный ШИМ и не годиться для массы применений. Для него нужен фильтр в секунды...

Правда пока не могу объяснить следование импульсов пачками.
Кратности делителя и прешкалера наверно. По этому надо оперировать обоими и тогда ещё расширяется "битность" отфильтрованного аналогового сигнала. От биений необходимо избавиться - они пролезут через фильтр. Частота биений у меня была 5кГц - это значит что нужен герцовый фильтр, что убивает сразу аппаратный ШИМ. Но главное - ШИМ дает наводку на приемник при плохой разводке проводов с модуля...
 
Сверху Снизу