обманка для компа

fuso
Offline
Зарегистрирован: 14.02.2016

нужна программа для обманки автокомпа:

имеем входной сигнал: ШИМ частота 300 Гц

на выходе нужен ШИМ с 50% скважностью

зависимость такая: при уменьшении скважности, меняется частота на выходе, скважность не меняется.

fuso
Offline
Зарегистрирован: 14.02.2016

примерная зависимость: при скважности 69,7% - частота 58,82Гц

66,7%-60,24Гц

57,6%-73,53Гц

30,7%-116,28Гц

30,3% -119,05Гц

 

 

 

 

Onkel
Offline
Зарегистрирован: 22.02.2016

 

На чем делать? На ардуинах? Пишите ydom@mail.ru . Вам и на самой маленькой ардуине, мини , пойдет. Код могу написать на arduino ide, могу на честном С, без ардуиновских костылей и тормозов. А тут, скорее всего, именно такой и понадобится- разница между шириной импульсов со скважностью 30.7 и 30.3 % всего лишь 13 мкс, тут только честным С.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

А нечестный С не справится, ага...

Onkel
Offline
Зарегистрирован: 22.02.2016

Может и справится, но это будет аналог супа из топора, -  даже не точность, а просто кратность micros() 4 uS.  Если для тс важна разница даже в 13 мкс, то надо это учесть.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

На этих частотах нет необходимости в чем-то сложнее "блинка".

Длительность входного импульма измеряется pulseln(), выходной сигнал генерится  tone().

pulseln() даст точность до 0.2% , tone() на этих частотах даст большую точность, чем нужно автокомпу (это явно обороты двигателя).

Функцию пересчета нужно апроксимировать из выданных 5 точек, или выпытать у ТС с паяльником и утюгом ;).

В цикле измеряем с усреднением скважность, допустим делаем 25 измерений, пересчитываем частоту и вызывем tone(). Получтся примерно раз в 100 мс изменяем частоту для "обмана" автокомпа.

ТС, это то, что надо? С кодировкой сами справитесь? На всяких случай  добавил пару строк к примеру для pulseln().

//это прямо из описания функции на этом сайте пример, я просто добавил строк
// поэтому все кривое. Простите, но "мопед не мой"

int pin = 7; //какой-то пин для пульса
unsigned long duration = 100;
unsigned int freq;

#define PDC_to_fr(x)     (165.4 - 1.6*(x))  //bla-bla-bla
//тут определяем функцию пересчета скважности (Pulse Duty Cycle) в частоту

int Outpin = 9; //в нано он на таймер1, который 16 бит. это лучше
 
void setup()
{
  pinMode(pin, INPUT);
  pimMode(Outpin, OUTPUT);
}
 
void loop()
{
//duration = 100; //перенесенов начало
  for (int i = 0; i<25;i++) duration = (duration*4 + pulseIn(pin, HIGH))/5;
//(duration / 300)*100% - это скважность, сокращаем до duration/3.0 
freq = PDC_to_fr(duration/3.0);

tone(Outpin,freq)
}

 

fuso
Offline
Зарегистрирован: 14.02.2016

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

так что нужно из этих точек апроксимировать.

не понятны строки  21,22

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

21 и 22  это вариант стандартного усреднения.

fuso
Offline
Зарегистрирован: 14.02.2016

так может мне сразу pulseIn считывать и его в частоту апроксимировать?

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

все равно, чтобы сигнал на выходе был не сильно дерганым, нужно менять его не часто. Примерно 10 раз в секунду - нормально. Контроллеру нечем заняться. Пусть он все это время усредняет измеренное значение длины импульса. Среднее - всегда лучше одного измерения. Мало ли, что помешало?

Таким образом убиваешь двух зайцев. И измерения точнее и время потратил.

Инициализацию "duration=100;" перенеси в ее объявление. Так лучше будет. Следующее измерение будет начинать усредние от значения предыдущего.

fuso
Offline
Зарегистрирован: 14.02.2016

у меня процесор так то ещё по двум терморезисторам температуру усредняет и шим для этого мотора создает

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

По "хорошему" нужно, действительно, писать без библиотек.

1.Иметь полную картину того, что должен делать контроллер.

2. Учитывать, что контроллер стоит 120 р. и Возможно удобнее иметь их несколько, для разных задач.

3. Длительность импульса измерять четко, по прерыванию, Удобнее делать это на INT ноге, чем на PCINT- выйдет точнее. Или, даже, измерять таймером.

4. Генерировать меандр на таймере, функция tone() примерно так и делает,  но с кучей лишнего. Если задать режим генерации самому, то можно делать это точнее и без срыва фазы в переходных режимах.

------

То есть, писать, в этом случае, нужно, как выражается один местный деятель, "на честном С". И это совсем другое программирование и ценник там будет от 10 рублей. Есть желание? - олвейс велкам! Нет - используйте то, что написано выше. Зато бесплатно.

fuso
Offline
Зарегистрирован: 14.02.2016

буду пробовать, если срывов не будет оставлю так.

мыло можно для написания на"С+"

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

мой ник на жмейле.

MacSim
Offline
Зарегистрирован: 28.11.2012

строка 22 - усреднение? странная формула. сохраняли бы уж тогда последние 4 значения в масив и считали бы действительно среднее значение.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

о дорогой друг! расскажи же мне про срение, про арифметические, геометрические , скользящие и пропорциональные. Я обещаю внимать молча, с открытым ртом и конспектировать все твои слова, и даже физиологические отправления, как-то почесывания и покашливания....

--------------------------

здесь было непечатно. удалено самоцензурой...

Onkel
Offline
Зарегистрирован: 22.02.2016

wdrakula пишет:

о дорогой друг! расскажи же мне про срение, про арифметические, геометрические , скользящие и пропорциональные. Я обещаю внимать молча, с открытым ртом и конспектировать все твои слова, и даже физиологические отправления, как-то почесывания и покашливания....

--------------------------

здесь было непечатно. удалено самоцензурой...

Зачем вы юродствуете ? У вас 9 периодная экспоненциально взвешенная скользящая средняя, и всего-то.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Главное умными слвоами это все назвать и сделать задумчивый вид.