Выполнение кода в промежутке low ШИМа

Sloper
Sloper аватар
Offline
Зарегистрирован: 30.03.2015

Здраствуйте, возникла потребность синхронизировать чтение аналогово пина с шимом на пине например 9 или 10.

То есть, читать analogread() когда D9 в положении LOW, при этом на нем шим.

Из идей, сделать сой ISR по таймеру1, в ней самому генерить шим програмно и считывать аналоговый пин, когда D9 падает в 0. 

Или есть проще способ?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Sloper пишет:
Или есть проще способ?
Вот где вы берете такую траву. Почитайте что такое ШИМ и как измеряется величина на аналоговом пине.

Logik
Offline
Зарегистрирован: 05.08.2014

Делал нечто похожее, настраивайте таймер для генерации шима и разрешайте прерывания от этого таймера, в обработчике прерывания читаете ацп.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sloper,

надеюсь, Вы отдаёте себе отчёт, что ADC работает не мгновенно и даже если Вы будете начинать измерение в момент появления LOW на PWM, само измерени может занять большее время, чем этот LOW продержится?

Что касается "проще" - можно и проще. Вы, правда, не сказали какой у Вас контроллер, но если 328, то там можно настроить ADC, чтобы он сам стратовал по событию "Timer/Counter0 Compare Match". Тогда Вам не надо париться ни о чём, просто настройте таймер и снимайте готовые показания по предрыванию ADC (он умеет выдавать прерывания, когда результат готов).

Sloper
Sloper аватар
Offline
Зарегистрирован: 30.03.2015

qwone пишет:

Sloper пишет:
Или есть проще способ?
Вот где вы берете такую траву. Почитайте что такое ШИМ и как измеряется величина на аналоговом пине.

При чем тут рава??? По поему все понятно. Как изменяется шим и что это такое, я знаю.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Да я просто уверен, что у вас есть проблема и вы раздумываете как ее не решить. 

Sloper
Sloper аватар
Offline
Зарегистрирован: 30.03.2015

ЕвгенийП пишет:

Sloper,

надеюсь, Вы отдаёте себе отчёт, что ADC работает не мгновенно и даже если Вы будете начинать измерение в момент появления LOW на PWM, само измерени может занять большее время, чем этот LOW продержится

Н, спасибо за подсказку. Контроллер- 328, нано.

Да, конечно отдаю отчет. Именно по этому мах скважность будет такой,что бы оставить время на замер. Буд копать в сторону таймеров ADC.

 

Sloper
Sloper аватар
Offline
Зарегистрирован: 30.03.2015

qwone пишет:

Да я просто уверен, что у вас есть проблема и вы раздумываете как ее не решить. 

 

То, что вы пишите, так важно, что аж зубы сводит. Пишите еще, не сдерживайте себя!

Sloper
Sloper аватар
Offline
Зарегистрирован: 30.03.2015

ЕвгенийП пишет:

Sloper,

Что касается "проще" - можно и проще. Вы, правда, не сказали какой у Вас контроллер, но если 328, то там можно настроить ADC, чтобы он сам стратовал по событию "Timer/Counter0 Compare Match". 

Правда потом хочу переписать под аттини 84.

Green
Онлайн
Зарегистрирован: 01.10.2015

qwone пишет:

Вот где вы берете такую траву. Почитайте что такое ШИМ и как измеряется величина на аналоговом пине.

qwone, не в обиду. Но ШИМ на 9-й ноге можно же реализовать по разному. И с разным периодом. В т.ч. и программно.  Тем более что человек говорит что "самому генерить шим програмно и считывать аналоговый пин, когда D9 падает в 0".) А значит, если время есть, то почему бы его не использовать, логично? Ну чем бы дитя не тешилось...) Так что не всё так одназначно.)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sloper пишет:

Правда потом хочу переписать под аттини 84.

там это тоже есть. См. раздел "Starting a Conversion" в даташите хоть на 328, хоть на 84

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Green, чем мощнее машина, тем дальше идешь за трактором. Но я побуду зрителем с попкорном, чем трактором.

Sloper
Sloper аватар
Offline
Зарегистрирован: 30.03.2015

Logik пишет:

Делал нечто похожее, настраивайте таймер для генерации шима и разрешайте прерывания от этого таймера, в обработчике прерывания читаете ацп.

Ага, такая мысль есть тоже. Те можно гененрить шим по таймеру1и при этом сделать обработчик прерывания по этому таймеру? 

Просто везде написано, что если я сделаю так, то шима не будет. Либо шим либо прерывание + обработчик. Или я не то и не так читаю?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Где написано? В даташите?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Sloper пишет:

Ага, такая мысль есть тоже. Те можно гененрить шим по таймеру1и при этом сделать обработчик прерывания по этому таймеру? 

Просто везде написано, что если я сделаю так, то шима не будет. Либо шим либо прерывание + обработчик. Или я не то и не так читаю?

Наверное "не так" читаете. Работа таймера - она "сама по себе", независимое железо. Сказали "режим такой-то" он согласно настройкам будет выставлять свои ноги куда сказано. И, кстати, все свои прерывания он точно также будет генерить независимо от того "нужны они Вам или нет". Просто они могут быть а) запрещены на выходе из блока таймера в контроллер прерываний и б) запрещены в самом контроллере прерываний и в) на них может висеть пустой обработчик. Но, внутренние сигналы прерываний все одно генерируются независимо ни от чего.

Соответственно, возможно несколько решений:

а) реагировать на прерывание от таймера и запускать АЦП из под него ручками;

б) настроить работу АЦП (он так может, выше уже есть) так, чтобы таймер сам запускал выборку АЦП;

Независимо от способа запуска, реагировать на завершение оцифровки можно как по прерыванию от АЦП так и опрашивая соответствующий бит в его регистре управления (как это делает analogRead() ). Вариант ожидания завершения работы АЦП по опросу из под обработчика прерывания от таймера - пожалуй самый плохой. Но .. все зависит от многих обстоятельств.

Logik
Offline
Зарегистрирован: 05.08.2014

Sloper пишет:

Logik пишет:

Делал нечто похожее, настраивайте таймер для генерации шима и разрешайте прерывания от этого таймера, в обработчике прерывания читаете ацп.

Ага, такая мысль есть тоже. Те можно гененрить шим по таймеру1и при этом сделать обработчик прерывания по этому таймеру? 

Просто везде написано, что если я сделаю так, то шима не будет. Либо шим либо прерывание + обработчик. Или я не то и не так читаю?

Где это такое написано?! Все будет, надо только верить и хотеть. Ну и немножко уметь;)

Вспомнил я где такую хрень делал. DTMF генерил и разбирал. На одном таймере ШИМ генерится, ведется частота, аж две сразу и вводится аналоговый сигнал для последующего разбора.

Молебен о настройках таймера, честно спи..ная у неизвестного бойца

  TIMSK1|=1; //TOIE1
  
 /* clear OC1A on Compare Match, set OC1A at TOP */
 TCCR1A =   _BV(COM1A1); 
 /* fast PWM, 8 bit */
 TCCR1A |=  _BV(WGM10);
 TCCR1B = _BV(WGM12) ;
 /* no prescaling */
 TCCR1B |= _BV(CS10) ;

 

Заклинание прерывания таймера.

ISR(TIMER1_OVF_vect) 
{
 static uint16_t F_A;  
 static uint16_t F_B;

 F_A=dF_A?F_A+dF_A:0; 
 F_B=dF_B?F_B+dF_B:0; 

  unsigned int w=127+TabSin(F_A>>8)/2+TabSin(F_B>>8)/2;

  OCR1A=w>255?255:w;
  w=FlInternal?w:ADCH;
  byte y=F_8k+dF_8k;
  if(inpCount<sizeof(Arr)&&((y<F_8k)||(dF_8k==0))) //набираем данные в буфер 254 значения (кроме 0-го и 255-го) и останавливаемся
  {
   Arr[inpCount]=w;
   inpCount++;
  }

  F_8k=y;
  ADCSRA|=_BV(ADSC);// Запускаем преобразование 
}

ПС. Смотрю с вводом аналогового еще сложней, он на некоторой частоте сохраняется, хотя вводится на каждом прерывании. От это замутил...

Sloper
Sloper аватар
Offline
Зарегистрирован: 30.03.2015

Можетимеет смысл зайти от задачи. Я кручу dc мотор через драйвер, у которого на входе шим пин и вкл/выкл пин.

И мне нужно мерить эдс на аналоговом пине, одущую от мотора, что бы понимать, с какой скоростью он вращается. 

Обвязку всю я подсмотрел и сделал. Но, что бы мерить эдс, нужно в фазе нуля шима выключить драйвер и померить эдс. Включенный, он находится в режиме торможения и эдс не выдает.

В итоге, я хочу в момент падения напряжения на пине шим выключить драйвер, замерить эдс на аналоговом пине и опять включить драйвер.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Схему нарисуйте.

 

PS. Обычно частоту вращения определяют, считая импульсы: количество оборотов за единицу времени при высокой частоте вращения и длину периода обращения - при низкой.