Переделать millis на таймер 2

sergey_mak
Offline
Зарегистрирован: 07.01.2014

Здравствуйте, посоветуйте как поступить. Придумываю программу для регулятора оборотов двигателя. Железо уже готово и вносить изменения нет возможности. Загвоздка вот в чем, двигатель управляется шим с таймера 0. Этот же таймер нужен для функции millis и delay. На стандартной для arduino частоте шим, мотор отвратительно пищит. Нужно поднять частоту шим за звуковой диапазон, но тогда перестанут корректно считать время delay и millis. Таймер 2 свободен, вот я думаю можно ли как то залезть в потроха millis и переделать ее на второй таймер. Или не связываться с этим и строить временные интервалы вторым таймером...Хотел для программы воспользоваться готовым планировщиком (looper), а он работает на millis, вот и возник такой вопрос.

sergey_mak
Offline
Зарегистрирован: 07.01.2014

Прошу прощения, плохо гуглил. Если кому нибудь понадобится, то решение проблемы вот здесь -http://playground.arduino.cc/Main/TimerPWMCheatsheet

Dexter
Offline
Зарегистрирован: 06.01.2019

Добрый день, скажите а вам удалось решить проблему?

Незнаю что я делаю не так но рецепт по ссылке не работает. Частота шим увеличивается но так же и увеличивается в 64 раза длительность Delay и Millis (c)

Правка файло wiring.c ничего не даёт. Ерунда какаято.

UNO 328

-NMi-
Offline
Зарегистрирован: 20.08.2018

Dexter пишет:

Правка файло wiring.c ничего не даёт. Ерунда какаято.

UNO 328

ОтчегоЖ ерунда-то? Timer0 в дурдуине используется ВСЕГДА, даже в пустом скетче и представляет из себя (ща не помню точно) декрементный счётчик по переполнению ISR_Timer0_OVF. Если ты "напрямую" впихнул в регистры Timer0 другие коэффициенты делителя - получишь соответствующую твоей мессаге картину. Мне вот тока нипонятно, почему Mills увеличивается??? С увеличением ШИМ счётчик должен "вроде" как считать "быстрее" ... )))))

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

Dexter пишет:

Добрый день, скажите а вам удалось решить проблему?

Незнаю что я делаю не так но рецепт по ссылке не работает. Частота шим увеличивается но так же и увеличивается в 64 раза длительность Delay и Millis (c)

Правка файло wiring.c ничего не даёт. Ерунда какаято.

UNO 328

Не понятно, на кой фиг переносит millis() на таймер2 .. если он свободен, то куда как проще использовать его для ШИМ на моторах и регулировать частоту ШИМ на нем. Они в этом плане одинаковы, чуть более чем полностью. Переставьте моторы на таймер2 - всего-то делов.

Dexter
Offline
Зарегистрирован: 06.01.2019

Так, разобрался.

Оказывается рецепт по ссылке (правка строки wiring.c) работает только для Millis()

Delay и Міcros же не исправляется .

зы. Да, конечно же уменьшается )

Dexter
Offline
Зарегистрирован: 06.01.2019

Я вот про этот рецепт с изменением таймера0

PWM frequencies on Timer 0, pins 5 and 6, Arduino Uno

by yanngg, 02-15-2012

Timer 0 uses a prescale factor which is set to 64 by default
To set the prescale factor use this line in the setup function

Setting                          Prescale_factor
TCCR0B = _BV(CS00);              1
TCCR0B = _BV(CS01);              8
TCCR0B = _BV(CS00) | _BV(CS01);  64
TCCR0B = _BV(CS02);              256
TCCR0B = _BV(CS00) | _BV(CS02);  1024

To use Fast PWM on Timer 0
Write this line in the setup function
TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00); 
And to calculate the PWM frequency, use
Fast_PWM_frequency = (16 000 000)/(Prescale_factor*256); 

To use Phase-correct PWM on Timer 0 (half the frequency of Fast PWM)
Write this line in the setup function
TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM00); 
And to calculate the PWM frequency, use
Phase_correct_PWM_frequency = (16 000 000)/(Prescale_factor*510); 

Changing the prescale factor on Timer0 will affect functions
millis(), micros(), delay(),...

To adjust millis(), micros(), delay(),... accordingly,
You can modify a line in the wiring.c function in the Arduino program files
hardware\arduino\cores\arduino\wiring.c

In the beginning of wiring.c you can find:
// the prescaler is set so that timer0 ticks every 64 clock cycles, and the
// the overflow handler is called every 256 ticks.
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))

You need to modify the prescale factor in this function to the corresponding line

For fast PWM (default):
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(PRESCALE_FACTOR* 256))
For phase-correct PWM :
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(PRESCALE_FACTOR * 510))

Example: DC motor drive on the Arduino UNO, pins 5 and 6

For Fast PWM of 62.500 kHz (prescale factor of 1)
Use these two lines in the setup function:

TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00); 
TCCR0B = _BV(CS00); 

And modify the line in the wiring.c function in the Arduino program files
hardware\arduino\cores\arduino\wiring.c :
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(1 * 256))

For Phase-correct PWM of 31.250 kHz (prescale factor of 1)
Use these two lines in the setup function:

TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM00); 
TCCR0B = _BV(CS00); 

And modify the line in the wiring.c function in the Arduino program files
hardware\arduino\cores\arduino\wiring.c :
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(1 * 510))

-NMi-
Offline
Зарегистрирован: 20.08.2018

Вообще, если это так необходимо, можно полностью переделать ISR_Timer0_OVF для нужнй тебе частоты ШИМ и с соответствующей корректировкой функици mills(). Дизассемблируй Timer_OVF_Vector , возможно, я подскажу что и как переделать.

Но!!! Это может "потянуть" за собой череду глобальных неприятностей в "других" скетчах, которые даже и не "догадываются" о "модернизированной" функции mills(). Так-что здесЯ нужно иметь некий "скилл" , шоб не наступить на грабли.

SLKH
Offline
Зарегистрирован: 17.08.2015
-NMi-
Offline
Зарегистрирован: 20.08.2018

Всё это уже давно "обсосано" на Atmel-овских форумах.Тока на Timer1 16-ти битный ШИМ похож на велосипед с турбореактивным двигателем. Разогнаться можно, да только руля не слушаеццо)))

Не думайте, шо инженеры Atmel на столько "тупы", что не написали про 16-ти битную "фичу" в датащах а ограничили её 10-ю битами!