Выполнение кода в промежутке low ШИМа
- Войдите на сайт для отправки комментариев
Чт, 07/03/2019 - 15:47
Здраствуйте, возникла потребность синхронизировать чтение аналогово пина с шимом на пине например 9 или 10.
То есть, читать analogread() когда D9 в положении LOW, при этом на нем шим.
Из идей, сделать сой ISR по таймеру1, в ней самому генерить шим програмно и считывать аналоговый пин, когда D9 падает в 0.
Или есть проще способ?
Делал нечто похожее, настраивайте таймер для генерации шима и разрешайте прерывания от этого таймера, в обработчике прерывания читаете ацп.
Sloper,
надеюсь, Вы отдаёте себе отчёт, что ADC работает не мгновенно и даже если Вы будете начинать измерение в момент появления LOW на PWM, само измерени может занять большее время, чем этот LOW продержится?
Что касается "проще" - можно и проще. Вы, правда, не сказали какой у Вас контроллер, но если 328, то там можно настроить ADC, чтобы он сам стратовал по событию "Timer/Counter0 Compare Match". Тогда Вам не надо париться ни о чём, просто настройте таймер и снимайте готовые показания по предрыванию ADC (он умеет выдавать прерывания, когда результат готов).
При чем тут рава??? По поему все понятно. Как изменяется шим и что это такое, я знаю.
Да я просто уверен, что у вас есть проблема и вы раздумываете как ее не решить.
Sloper,
надеюсь, Вы отдаёте себе отчёт, что ADC работает не мгновенно и даже если Вы будете начинать измерение в момент появления LOW на PWM, само измерени может занять большее время, чем этот LOW продержится
Н, спасибо за подсказку. Контроллер- 328, нано.
Да, конечно отдаю отчет. Именно по этому мах скважность будет такой,что бы оставить время на замер. Буд копать в сторону таймеров ADC.
Да я просто уверен, что у вас есть проблема и вы раздумываете как ее не решить.
То, что вы пишите, так важно, что аж зубы сводит. Пишите еще, не сдерживайте себя!
Sloper,
Что касается "проще" - можно и проще. Вы, правда, не сказали какой у Вас контроллер, но если 328, то там можно настроить ADC, чтобы он сам стратовал по событию "Timer/Counter0 Compare Match".
Правда потом хочу переписать под аттини 84.
Вот где вы берете такую траву. Почитайте что такое ШИМ и как измеряется величина на аналоговом пине.
qwone, не в обиду. Но ШИМ на 9-й ноге можно же реализовать по разному. И с разным периодом. В т.ч. и программно. Тем более что человек говорит что "самому генерить шим програмно и считывать аналоговый пин, когда D9 падает в 0".) А значит, если время есть, то почему бы его не использовать, логично? Ну чем бы дитя не тешилось...) Так что не всё так одназначно.)
Правда потом хочу переписать под аттини 84.
там это тоже есть. См. раздел "Starting a Conversion" в даташите хоть на 328, хоть на 84
Green, чем мощнее машина, тем дальше идешь за трактором. Но я побуду зрителем с попкорном, чем трактором.
Делал нечто похожее, настраивайте таймер для генерации шима и разрешайте прерывания от этого таймера, в обработчике прерывания читаете ацп.
Ага, такая мысль есть тоже. Те можно гененрить шим по таймеру1и при этом сделать обработчик прерывания по этому таймеру?
Просто везде написано, что если я сделаю так, то шима не будет. Либо шим либо прерывание + обработчик. Или я не то и не так читаю?
Где написано? В даташите?
Ага, такая мысль есть тоже. Те можно гененрить шим по таймеру1и при этом сделать обработчик прерывания по этому таймеру?
Просто везде написано, что если я сделаю так, то шима не будет. Либо шим либо прерывание + обработчик. Или я не то и не так читаю?
Наверное "не так" читаете. Работа таймера - она "сама по себе", независимое железо. Сказали "режим такой-то" он согласно настройкам будет выставлять свои ноги куда сказано. И, кстати, все свои прерывания он точно также будет генерить независимо от того "нужны они Вам или нет". Просто они могут быть а) запрещены на выходе из блока таймера в контроллер прерываний и б) запрещены в самом контроллере прерываний и в) на них может висеть пустой обработчик. Но, внутренние сигналы прерываний все одно генерируются независимо ни от чего.
Соответственно, возможно несколько решений:
а) реагировать на прерывание от таймера и запускать АЦП из под него ручками;
б) настроить работу АЦП (он так может, выше уже есть) так, чтобы таймер сам запускал выборку АЦП;
Независимо от способа запуска, реагировать на завершение оцифровки можно как по прерыванию от АЦП так и опрашивая соответствующий бит в его регистре управления (как это делает analogRead() ). Вариант ожидания завершения работы АЦП по опросу из под обработчика прерывания от таймера - пожалуй самый плохой. Но .. все зависит от многих обстоятельств.
Делал нечто похожее, настраивайте таймер для генерации шима и разрешайте прерывания от этого таймера, в обработчике прерывания читаете ацп.
Ага, такая мысль есть тоже. Те можно гененрить шим по таймеру1и при этом сделать обработчик прерывания по этому таймеру?
Просто везде написано, что если я сделаю так, то шима не будет. Либо шим либо прерывание + обработчик. Или я не то и не так читаю?
Где это такое написано?! Все будет, надо только верить и хотеть. Ну и немножко уметь;)
Вспомнил я где такую хрень делал. DTMF генерил и разбирал. На одном таймере ШИМ генерится, ведется частота, аж две сразу и вводится аналоговый сигнал для последующего разбора.
Молебен о настройках таймера, честно спи..ная у неизвестного бойца
Заклинание прерывания таймера.
ПС. Смотрю с вводом аналогового еще сложней, он на некоторой частоте сохраняется, хотя вводится на каждом прерывании. От это замутил...
Можетимеет смысл зайти от задачи. Я кручу dc мотор через драйвер, у которого на входе шим пин и вкл/выкл пин.
И мне нужно мерить эдс на аналоговом пине, одущую от мотора, что бы понимать, с какой скоростью он вращается.
Обвязку всю я подсмотрел и сделал. Но, что бы мерить эдс, нужно в фазе нуля шима выключить драйвер и померить эдс. Включенный, он находится в режиме торможения и эдс не выдает.
В итоге, я хочу в момент падения напряжения на пине шим выключить драйвер, замерить эдс на аналоговом пине и опять включить драйвер.
Схему нарисуйте.
PS. Обычно частоту вращения определяют, считая импульсы: количество оборотов за единицу времени при высокой частоте вращения и длину периода обращения - при низкой.