PWM Arduino MEGA vs Arduino Nano

Seyran
Offline
Зарегистрирован: 04.08.2017
analogWrite(2, 170);
analogWrite(7, 200);

Запускаю ШИМ на ножках 2,7 Arduino MEGA2560 и наблюдаю следующие проблемы:

1. ШИМ модулированный частотно

2. Могу запустить ШИМ только на одной ножке

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

Кто сталкивался, что за трабла и как починить?

rkit
Offline
Зарегистрирован: 23.11.2016

Seyran пишет:

1. ШИМ модулированный частотно

Что бы это могло значить

Seyran
Offline
Зарегистрирован: 04.08.2017

Это значит что высокий уровень заполнен меандром на более высокой частоте. Ща попробую картинки прилепить

Seyran
Offline
Зарегистрирован: 04.08.2017

Более важен второй вопрос, почему я не могу на нескольких ножках запускать ШИМ ? Проверял на разных ардуинах, есть пара оригинальных, есть купленные на али китайские клоны, на всех одинаково работает.

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

С ШИМ-ами не всё ток просто. Разберись сначала с железом а уж потом с софтом, ибо зависимо оно оч. сильно.

Seyran
Offline
Зарегистрирован: 04.08.2017

Железо сто пудово мега 2560, на нано просто проверил. А по поводу софта прошу уточнения, что имелось в виду ?

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

Seyran пишет:

А по поводу софта прошу уточнения, что имелось в виду ?

Ноги таймера конкретно привязаны к PWM выводам процессора. В 2560 нет Mapping-а , впрочем как и у наны!

Софт ИСПОЛЬЗУЕТ таймеры по своему назначению и ЕСЛИ в какой-то момент ВДРУГ часть софта "украдёт" таймер у другой части софта - будут СОФТВАРНЫЕ проблемы!!!

Иными словами - нельзя вот так вот ПРОСТО взять любой таймер!!!

ЕСЛИ Я НАПИСАЛ НЕПОНЯТНЫМ ЯЗЫКОМ: с аппаратной (hardware) частью нужно работать ЗАРАНЕЕ , а уже потом всё это дело кодить на уровне СОФТА!!!   Иначе будет вот так, как у тебя на осцилле.

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

Seyran пишет:

Более важен второй вопрос, почему я не могу на нескольких ножках запускать ШИМ ?

ПаТаМуЧТО ардуина даже в ПУСТОМ скетче ИСПОЛЬЗУЕТ Timer0!!!

Есть библиотеки, которые используют ДРУГИЕ таймеры и могут КОНФЛИКТОВАТЬ между собой!!!

Так понятнее?????

Seyran
Offline
Зарегистрирован: 04.08.2017

Эксперимент проводился на пустом скетче без подключения каких либо библиотек

void setup() {
 
  pinMode( 2, OUTPUT );
  pinMode( 3, OUTPUT );
  pinMode( 4, OUTPUT );
  pinMode( 5, OUTPUT );
  pinMode( 6, OUTPUT );
  pinMode( 7, OUTPUT );
  
}

void loop() {

  analogWrite(2, 100);
  analogWrite(7, 200);
  
  digitalWrite( 3, LOW );
  digitalWrite( 4, HIGH );
  digitalWrite( 5, HIGH );
  digitalWrite( 6, LOW );
 
}

вот весь код эксперимента

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

Ноги 2 и 7 к какому таймеру относятся???

rkit
Offline
Зарегистрирован: 23.11.2016

Seyran пишет:

Это значит что высокий уровень заполнен меандром на более высокой частоте. Ща попробую картинки прилепить

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

Seyran
Offline
Зарегистрирован: 04.08.2017

-NMi- пишет:

Ноги 2 и 7 к какому таймеру относятся???

 

OC3B и OC4B соответственно

пробовал OC3B и OC3С соответственно ножки 2 и 3, вот в этом случае работает только один вывод, когда с разных таймеров то не работает ни один, при задании двух

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

Seyran пишет:

Эксперимент проводился на пустом скетче без подключения каких либо библиотек

вот весь код эксперимента

Строку №18 сразу же в топку. Вам тут уже долго пытаются объяснить, что нулевой таймер в ардуино занят, нельзя на его ногах (4 и 13) ШИМ использовать.

test1
Offline
Зарегистрирован: 06.01.2020

Seyran пишет:

Это значит что высокий уровень заполнен меандром на более высокой частоте. Ща попробую картинки прилепить

Очень интересно. Работаю с Мегой 2560, со всеми таймерами, в т.ч. и с Т0 с ШИМом .. ни разу такого не наблюдал.

Все таймеры в Ардуино (хоть Мега, хоть НАНО, и т.д.) инициализируются единообразно на ШИМ с частотой около 500гц, чуть ниже. То, что таймер 0 используется как "счетчик миллис" на ШИМ выходы не должно влиять от слова "никак", т.к. ШИМ - это выходы совсем иной части таймеров.

Подозреваю, что у Вас лезут какие-то наводки ВЧ из-за плохих контактов. Дуня тут скорее всего не при делах.

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

test1 пишет:

Все таймеры в Ардуино (хоть Мега, хоть НАНО, и т.д.) инициализируются единообразно на ШИМ с частотой около 500гц, чуть ниже.

У нулевого частота вдвое выше, чем у остальных.

Seyran
Offline
Зарегистрирован: 04.08.2017

Евгений, да что вам дался этот нулевой таймер. Пины 3-14 по умолчанию пины для вывода ШИМ стандартной функцией analogWrite 

Seyran
Offline
Зарегистрирован: 04.08.2017

попробовал на Уно, на нем тоже все работает, так что глюк только на меге 2560

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

test1 пишет:

Работаю с Мегой 2560, со всеми таймерами, в т.ч. и с Т0 с ШИМом

А разве мы утверждали, что это невозможно???

test1 пишет:

Все таймеры в Ардуино (хоть Мега, хоть НАНО, и т.д.) инициализируются единообразно на ШИМ с частотой около 500гц, чуть ниже.

Не спорю, но апосля инита эти таймеры можно "настроить" вплоть до "поломки" дурдуины!

test1 пишет:

То, что таймер 0 используется как "счетчик миллис" на ШИМ выходы не должно влиять от слова "никак", т.к. ШИМ - это выходы совсем иной части таймеров.

Т.е. на коротком прескалере ШИМ Т0 будет ~62кГц и это не будет влиять "никак" ???

Seyran
Offline
Зарегистрирован: 04.08.2017

если кому интересно, то я разобрался с проблемой. На меге 2560 не так как на 328й с ШИМом. Подробности можно почитать по ссылке http://astro.neutral.org/arduino/arduino-pwm-pins-frequency.shtml . Достаточно просто задать генерацию на пинах

analogWrite(2, 1);
analogWrite(7, 1);

а далее уже задавать напрямую в регистр счетчика уровень ШИМ, вот список соответствия регистров пинам

Arduino Pin	 Register
2	                 OCR3B
3	                 OCR3C
4	                 OCR4C
5	                 OCR3A
6	                 OCR4A
7	                 OCR4B
8	                 OCR4C
9	                 OCR2B
10	                 OCR2A
11	                 OCR1A
12	                 OCR1B
13	                 OCR0A
44	                 OCR5C
45	                 OCR5B
46	                 OCR5A

 

test1
Offline
Зарегистрирован: 06.01.2020

Seyran пишет:

если кому интересно, то я разобрался с проблемой. На меге 2560 не так как на 328й с ШИМом. Подробности можно почитать по ссылке http://astro.neutral.org/arduino/arduino-pwm-pins-frequency.shtml . Достаточно просто задать генерацию на пинах

analogWrite(2, 1);
analogWrite(7, 1);

а далее уже задавать напрямую в регистр счетчика уровень ШИМ, вот список соответствия регистров пинам

Arduino Pin	 Register
2	                 OCR3B
3	                 OCR3C
4	                 OCR4C
5	                 OCR3A
6	                 OCR4A
7	                 OCR4B
8	                 OCR4C
9	                 OCR2B
10	                 OCR2A
11	                 OCR1A
12	                 OCR1B
13	                 OCR0A
44	                 OCR5C
45	                 OCR5B
46	                 OCR5A

 

Как конкретно разобрались-то? У Вас на осцилограмме ШИМ заполнен ВЧ сигналом .. это "откуда", разобрались? Интересно что это было, все же. Ни разу с таким не сталкивался.

test1
Offline
Зарегистрирован: 06.01.2020

-NMi- пишет:

test1 пишет:

Работаю с Мегой 2560, со всеми таймерами, в т.ч. и с Т0 с ШИМом

А разве мы утверждали, что это невозможно???

test1 пишет:

Все таймеры в Ардуино (хоть Мега, хоть НАНО, и т.д.) инициализируются единообразно на ШИМ с частотой около 500гц, чуть ниже.

Не спорю, но апосля инита эти таймеры можно "настроить" вплоть до "поломки" дурдуины!

test1 пишет:

То, что таймер 0 используется как "счетчик миллис" на ШИМ выходы не должно влиять от слова "никак", т.к. ШИМ - это выходы совсем иной части таймеров.

Т.е. на коротком прескалере ШИМ Т0 будет ~62кГц и это не будет влиять "никак" ???

Ни чё не понял, переведите, если не трудно.

test1
Offline
Зарегистрирован: 06.01.2020

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

test1 пишет:

Все таймеры в Ардуино (хоть Мега, хоть НАНО, и т.д.) инициализируются единообразно на ШИМ с частотой около 500гц, чуть ниже.

У нулевого частота вдвое выше, чем у остальных.

Вот тут написано иначе, или я ошибаюсь? Буду признателен, если покажете в какой конкретно строке для 328 и 2560:

void init()
{
    // this needs to be called before setup() or some functions won't
    // work there
    sei();
    
    // on the ATmega168, timer 0 is also used for fast hardware pwm
    // (using phase-correct PWM would mean that timer 0 overflowed half as often
    // resulting in different millis() behavior on the ATmega8 and ATmega168)
#if defined(TCCR0A) && defined(WGM01)
    sbi(TCCR0A, WGM01);
    sbi(TCCR0A, WGM00);
#endif

    // set timer 0 prescale factor to 64
#if defined(__AVR_ATmega128__)
    // CPU specific: different values for the ATmega128
    sbi(TCCR0, CS02);
#elif defined(TCCR0) && defined(CS01) && defined(CS00)
    // this combination is for the standard atmega8
    sbi(TCCR0, CS01);
    sbi(TCCR0, CS00);
#elif defined(TCCR0B) && defined(CS01) && defined(CS00)
    // this combination is for the standard 168/328/1280/2560
    sbi(TCCR0B, CS01);
    sbi(TCCR0B, CS00);
#elif defined(TCCR0A) && defined(CS01) && defined(CS00)
    // this combination is for the __AVR_ATmega645__ series
    sbi(TCCR0A, CS01);
    sbi(TCCR0A, CS00);
#else
    #error Timer 0 prescale factor 64 not set correctly
#endif

Это выдержка из init() Ардуины, версия 1.8.11

test1
Offline
Зарегистрирован: 06.01.2020

Вот про таймер2, он тоже 8-и битный:

    // set timer 2 prescale factor to 64
#if defined(TCCR2) && defined(CS22)
    sbi(TCCR2, CS22);
#elif defined(TCCR2B) && defined(CS22)
    sbi(TCCR2B, CS22);
//#else
    // Timer 2 not finished (may not be present on this CPU)
#endif
 

там же.

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

test1 пишет:

Вот тут написано иначе, или я ошибаюсь? Буду признателен, если покажете в какой конкретно строке для 328 и 2560:

Ошибаетесь. Вы зря не вставили код с номерами строк, чтобы я мог ссылаться.

Дело в том, что все три таймера конфигурируются на делитель частоты 64, тут Вы правы, но при этом 0-ой таймер конфигурируется на FastPWM (строки №№11-12 в коде ниже), а остальные на Phase correct PWM (строки №№ 65 и 81). Потому у нулевого частота вдвое выше.

Я пометил эти места в коде функции init комментариями

void init()
{
	// this needs to be called before setup() or some functions won't
	// work there
	sei();
	
	// on the ATmega168, timer 0 is also used for fast hardware pwm
	// (using phase-correct PWM would mean that timer 0 overflowed half as often
	// resulting in different millis() behavior on the ATmega8 and ATmega168)
#if defined(TCCR0A) && defined(WGM01)
	sbi(TCCR0A, WGM01);  // ЭТО FastPWM
	sbi(TCCR0A, WGM00);
#endif

	// set timer 0 prescale factor to 64
#if defined(__AVR_ATmega128__)
	// CPU specific: different values for the ATmega128
	sbi(TCCR0, CS02);
#elif defined(TCCR0) && defined(CS01) && defined(CS00)
	// this combination is for the standard atmega8
	sbi(TCCR0, CS01);
	sbi(TCCR0, CS00);
#elif defined(TCCR0B) && defined(CS01) && defined(CS00)
	// this combination is for the standard 168/328/1280/2560
	sbi(TCCR0B, CS01);
	sbi(TCCR0B, CS00);
#elif defined(TCCR0A) && defined(CS01) && defined(CS00)
	// this combination is for the __AVR_ATmega645__ series
	sbi(TCCR0A, CS01);
	sbi(TCCR0A, CS00);
#else
	#error Timer 0 prescale factor 64 not set correctly
#endif

	// enable timer 0 overflow interrupt
#if defined(TIMSK) && defined(TOIE0)
	sbi(TIMSK, TOIE0);
#elif defined(TIMSK0) && defined(TOIE0)
	sbi(TIMSK0, TOIE0);
#else
	#error	Timer 0 overflow interrupt not set correctly
#endif

	// timers 1 and 2 are used for phase-correct hardware pwm
	// this is better for motors as it ensures an even waveform
	// note, however, that fast pwm mode can achieve a frequency of up
	// 8 MHz (with a 16 MHz clock) at 50% duty cycle

#if defined(TCCR1B) && defined(CS11) && defined(CS10)
	TCCR1B = 0;

	// set timer 1 prescale factor to 64
	sbi(TCCR1B, CS11);
#if F_CPU >= 8000000L
	sbi(TCCR1B, CS10);
#endif
#elif defined(TCCR1) && defined(CS11) && defined(CS10)
	sbi(TCCR1, CS11);
#if F_CPU >= 8000000L
	sbi(TCCR1, CS10);
#endif
#endif
	// put timer 1 in 8-bit phase correct pwm mode
#if defined(TCCR1A) && defined(WGM10)
	sbi(TCCR1A, WGM10); // ЭТО Phase Correct PWM, 8-bit
#endif

	// set timer 2 prescale factor to 64
#if defined(TCCR2) && defined(CS22)
	sbi(TCCR2, CS22);
#elif defined(TCCR2B) && defined(CS22)
	sbi(TCCR2B, CS22);
//#else
	// Timer 2 not finished (may not be present on this CPU)
#endif

	// configure timer 2 for phase correct pwm (8-bit)
#if defined(TCCR2) && defined(WGM20)
	sbi(TCCR2, WGM20);
#elif defined(TCCR2A) && defined(WGM20)
	sbi(TCCR2A, WGM20); // ЭТО Phase Correct PWM
//#else
	// Timer 2 not finished (may not be present on this CPU)
#endif

Понятна разница? Впрочем, Вы также можете замерить частоту.

test1
Offline
Зарегистрирован: 06.01.2020

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

test1 пишет:

Вот тут написано иначе, или я ошибаюсь? Буду признателен, если покажете в какой конкретно строке для 328 и 2560:

Ошибаетесь. Вы зря не вставили код с номерами строк, чтобы я мог ссылаться.

Дело в том, что все три таймера конфигурируются на делитель частоты 64, тут Вы правы, но при этом 0-ой таймер конфигурируется на FastPWM, а остальные на Phase correct PWM. Потому у нулевого частота вдвое выше.

Я пометил эти места в коде функции init

void init()
{
	// this needs to be called before setup() or some functions won't
	// work there
	sei();
	
	// on the ATmega168, timer 0 is also used for fast hardware pwm
	// (using phase-correct PWM would mean that timer 0 overflowed half as often
	// resulting in different millis() behavior on the ATmega8 and ATmega168)
#if defined(TCCR0A) && defined(WGM01)
	sbi(TCCR0A, WGM01);  // ЭТО FastPWM
	sbi(TCCR0A, WGM00);
#endif

	// set timer 0 prescale factor to 64
#if defined(__AVR_ATmega128__)
	// CPU specific: different values for the ATmega128
	sbi(TCCR0, CS02);
#elif defined(TCCR0) && defined(CS01) && defined(CS00)
	// this combination is for the standard atmega8
	sbi(TCCR0, CS01);
	sbi(TCCR0, CS00);
#elif defined(TCCR0B) && defined(CS01) && defined(CS00)
	// this combination is for the standard 168/328/1280/2560
	sbi(TCCR0B, CS01);
	sbi(TCCR0B, CS00);
#elif defined(TCCR0A) && defined(CS01) && defined(CS00)
	// this combination is for the __AVR_ATmega645__ series
	sbi(TCCR0A, CS01);
	sbi(TCCR0A, CS00);
#else
	#error Timer 0 prescale factor 64 not set correctly
#endif

	// enable timer 0 overflow interrupt
#if defined(TIMSK) && defined(TOIE0)
	sbi(TIMSK, TOIE0);
#elif defined(TIMSK0) && defined(TOIE0)
	sbi(TIMSK0, TOIE0);
#else
	#error	Timer 0 overflow interrupt not set correctly
#endif

	// timers 1 and 2 are used for phase-correct hardware pwm
	// this is better for motors as it ensures an even waveform
	// note, however, that fast pwm mode can achieve a frequency of up
	// 8 MHz (with a 16 MHz clock) at 50% duty cycle

#if defined(TCCR1B) && defined(CS11) && defined(CS10)
	TCCR1B = 0;

	// set timer 1 prescale factor to 64
	sbi(TCCR1B, CS11);
#if F_CPU >= 8000000L
	sbi(TCCR1B, CS10);
#endif
#elif defined(TCCR1) && defined(CS11) && defined(CS10)
	sbi(TCCR1, CS11);
#if F_CPU >= 8000000L
	sbi(TCCR1, CS10);
#endif
#endif
	// put timer 1 in 8-bit phase correct pwm mode
#if defined(TCCR1A) && defined(WGM10)
	sbi(TCCR1A, WGM10); // ЭТО Phase Correct PWM, 8-bit
#endif

	// set timer 2 prescale factor to 64
#if defined(TCCR2) && defined(CS22)
	sbi(TCCR2, CS22);
#elif defined(TCCR2B) && defined(CS22)
	sbi(TCCR2B, CS22);
//#else
	// Timer 2 not finished (may not be present on this CPU)
#endif

	// configure timer 2 for phase correct pwm (8-bit)
#if defined(TCCR2) && defined(WGM20)
	sbi(TCCR2, WGM20);
#elif defined(TCCR2A) && defined(WGM20)
	sbi(TCCR2A, WGM20); // ЭТО Phase Correct PWM
//#else
	// Timer 2 not finished (may not be present on this CPU)
#endif

Понятна разница? Впрочем, Вы также можете замерить частоту.

Спасибо. Код вставлять тут не умею, это впервые.

Как вижу, этот режим ставится не только для таймера0, но и для таймера2 точно также. То есть режимы отличаются не для таймера0 исключительно (как у Вас выше), а для 8 и 16-и разрядных таймеров в целом. Кстати и для 328 это тоже также, одинаково получается.

То есть никакого исключения в части ШИМ у таймера0 нет из-за того, что он считает время и миллис. Или это не так? Меня в вашем ответе заинтересовал только этот момент. Вы написали, что только у него такое.

b707
Offline
Зарегистрирован: 26.05.2017

Seyran пишет:

если кому интересно, то я разобрался с проблемой.

Достаточно просто задать генерацию на пинах

analogWrite(2, 1);
analogWrite(7, 1);

а далее уже задавать напрямую в регистр счетчика уровень ШИМ, вот список соответствия регистров пинам

Arduino Pin	 Register
2	                 OCR3B
3	                 OCR3C
4	                 OCR4C
5	                 OCR3A
6	                 OCR4A
7	                 OCR4B
8	                 OCR4C
9	                 OCR2B
10	                 OCR2A
11	                 OCR1A
12	                 OCR1B
13	                 OCR0A
44	                 OCR5C
45	                 OCR5B
46	                 OCR5A

 

хм, а зачем эти танцы с бубном? Если вы уже пользуетесь analogWrite(). то почему сразу не задать уровень ШИМ

analogWrite(2, 128);    // ШИМ 50% на ноге 2

 

b707
Offline
Зарегистрирован: 26.05.2017

test1 пишет:

То есть никакого исключения в части ШИМ у таймера0 нет из-за того, что он считает время и миллис.

нет.

Не знаю, откуда тут взялось это коллективное затмение, но подсчет миллис никак не влияет на возможность использовать Таймер0 для ШИМ

test1
Offline
Зарегистрирован: 06.01.2020

b707 пишет:

test1 пишет:

То есть никакого исключения в части ШИМ у таймера0 нет из-за того, что он считает время и миллис.

нет.

Не знаю, откуда тут взялось это коллективное затмение, но подсчет миллис никак не влияет на возможность использовать Таймер0 для ШИМ

Вот и мне непонятно откуда у автора такая осцилограмма, и тем более интересно КАК он разобрался. Всё остальное не так уж и интересно, какой там ШИМ конкретно и у какого таймера. analogWrite() мне хватает почти всегда.

b707
Offline
Зарегистрирован: 26.05.2017

test1 пишет:

Вот и мне непонятно откуда у автора такая осцилограмма, и тем более интересно КАК он разобрался.

Я не видел его кода. Судя по последнему "рецепту" мешать в одну кучу analogWrite() и прямую запись в регистры - он, видимо,  понимает в этом мало, так что неизвестно. что он там наворотил

test1
Offline
Зарегистрирован: 06.01.2020

Seyran пишет:

Эксперимент проводился на пустом скетче без подключения каких либо библиотек

void setup() {
 
  pinMode( 2, OUTPUT );
  pinMode( 3, OUTPUT );
  pinMode( 4, OUTPUT );
  pinMode( 5, OUTPUT );
  pinMode( 6, OUTPUT );
  pinMode( 7, OUTPUT );
  
}

void loop() {

  analogWrite(2, 100);
  analogWrite(7, 200);
  
  digitalWrite( 3, LOW );
  digitalWrite( 4, HIGH );
  digitalWrite( 5, HIGH );
  digitalWrite( 6, LOW );
 
}

вот весь код эксперимента

Его осцилограмма разве не к этому коду относилась?

b707
Offline
Зарегистрирован: 26.05.2017

test1 пишет:

Seyran пишет:

Эксперимент проводился на пустом скетче без подключения каких либо библиотек

void setup() {
 
  pinMode( 2, OUTPUT );
  pinMode( 3, OUTPUT );
  pinMode( 4, OUTPUT );
  pinMode( 5, OUTPUT );
  pinMode( 6, OUTPUT );
  pinMode( 7, OUTPUT );
  
}

void loop() {

  analogWrite(2, 100);
  analogWrite(7, 200);
  
  digitalWrite( 3, LOW );
  digitalWrite( 4, HIGH );
  digitalWrite( 5, HIGH );
  digitalWrite( 6, LOW );
 
}

вот весь код эксперимента

Его осцилограмма разве не к этому коду относилась?

если взять мегу и залить в нее этот код - разве будет меандр на осциле? - значит или код или график не оттуда

Кстати. на графике не высокий уровень заполнен меандром, а низкий

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

b707 пишет:

Не знаю, откуда тут взялось это коллективное затмение, но подсчет миллис никак не влияет на возможность использовать Таймер0 для ШИМ

Базаришь!!! Конечно подсчёт никак не влияет на ШИМ, а вот ШИМ ещё как влияет на миллис. Вы читайте ВНИМАТЕЛЬНЕЕ посты, ибо ШИМ на 495Гц и на 62кГц мне кажется отличается, или нет???

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А если эксперимент провести так - чего будет?

void setup() {
 
  pinMode( 2, OUTPUT );
  pinMode( 3, OUTPUT );
  pinMode( 4, OUTPUT );
  pinMode( 5, OUTPUT );
  pinMode( 6, OUTPUT );
  pinMode( 7, OUTPUT );
  
}

void loop() {

  analogWrite(2, 100);
  analogWrite(7, 200);
  
  digitalWrite( 3, LOW );
  digitalWrite( 4, HIGH );
  digitalWrite( 5, HIGH );
  digitalWrite( 6, LOW );
while(1);
 
}

 

b707
Offline
Зарегистрирован: 26.05.2017

-NMi- пишет:

читайте ВНИМАТЕЛЬНЕЕ посты, ибо ШИМ на 495Гц и на 62кГц мне кажется отличается, или нет???

обратите этот совет к себе :) ТС ни разу не писал, что он меняет стандартные настройки ардуиновского ШИМ - и его код выше тоже ничего подобного не содержит.

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

b707 пишет:

обратите этот совет к себе :) ТС ни разу не писал, что он меняет стандартные настройки ардуиновского ШИМ - и его код выше тоже ничего подобного не содержит.

ТС вААще ничо не писал - всё что выше голимая копипаста, втч. и с "магическим решением" его якобы проблемы!!!

А на счёт миллсов и прочего - могу наспор ЗАПРОСТО "сломать" любой код прям вот парой-тройкой строчек!!!

Так шо НИНАДО пейсать того, чего не было!!!

b707
Offline
Зарегистрирован: 26.05.2017

-NMi- пишет:

Так шо НИНАДО пейсать того, чего не было!!!

вот именно :) - и не пиши

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

b707 пишет:

 - и не пиши

ТОГДА возьми его скетч, компильни и прицепи к нему осцилл и запость СЮДОЙ картинко!!! Будем искать много отличий!!!  Ну и заодно потом апсудим, кто да чё!!!

test1
Offline
Зарегистрирован: 06.01.2020

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

test1 пишет:

Вот тут написано иначе, или я ошибаюсь? Буду признателен, если покажете в какой конкретно строке для 328 и 2560:

Ошибаетесь. Вы зря не вставили код с номерами строк, чтобы я мог ссылаться.

Дело в том, что все три таймера конфигурируются на делитель частоты 64, тут Вы правы, но при этом 0-ой таймер конфигурируется на FastPWM (строки №№11-12 в коде ниже), а остальные на Phase correct PWM (строки №№ 65 и 81). Потому у нулевого частота вдвое выше.

Я пометил эти места в коде функции init комментариями

void init()
{
	// this needs to be called before setup() or some functions won't
	// work there
	sei();
	
	// on the ATmega168, timer 0 is also used for fast hardware pwm
	// (using phase-correct PWM would mean that timer 0 overflowed half as often
	// resulting in different millis() behavior on the ATmega8 and ATmega168)
#if defined(TCCR0A) && defined(WGM01)
	sbi(TCCR0A, WGM01);  // ЭТО FastPWM
	sbi(TCCR0A, WGM00);
#endif

	// set timer 0 prescale factor to 64
#if defined(__AVR_ATmega128__)
	// CPU specific: different values for the ATmega128
	sbi(TCCR0, CS02);
#elif defined(TCCR0) && defined(CS01) && defined(CS00)
	// this combination is for the standard atmega8
	sbi(TCCR0, CS01);
	sbi(TCCR0, CS00);
#elif defined(TCCR0B) && defined(CS01) && defined(CS00)
	// this combination is for the standard 168/328/1280/2560
	sbi(TCCR0B, CS01);
	sbi(TCCR0B, CS00);
#elif defined(TCCR0A) && defined(CS01) && defined(CS00)
	// this combination is for the __AVR_ATmega645__ series
	sbi(TCCR0A, CS01);
	sbi(TCCR0A, CS00);
#else
	#error Timer 0 prescale factor 64 not set correctly
#endif

	// enable timer 0 overflow interrupt
#if defined(TIMSK) && defined(TOIE0)
	sbi(TIMSK, TOIE0);
#elif defined(TIMSK0) && defined(TOIE0)
	sbi(TIMSK0, TOIE0);
#else
	#error	Timer 0 overflow interrupt not set correctly
#endif

	// timers 1 and 2 are used for phase-correct hardware pwm
	// this is better for motors as it ensures an even waveform
	// note, however, that fast pwm mode can achieve a frequency of up
	// 8 MHz (with a 16 MHz clock) at 50% duty cycle

#if defined(TCCR1B) && defined(CS11) && defined(CS10)
	TCCR1B = 0;

	// set timer 1 prescale factor to 64
	sbi(TCCR1B, CS11);
#if F_CPU >= 8000000L
	sbi(TCCR1B, CS10);
#endif
#elif defined(TCCR1) && defined(CS11) && defined(CS10)
	sbi(TCCR1, CS11);
#if F_CPU >= 8000000L
	sbi(TCCR1, CS10);
#endif
#endif
	// put timer 1 in 8-bit phase correct pwm mode
#if defined(TCCR1A) && defined(WGM10)
	sbi(TCCR1A, WGM10); // ЭТО Phase Correct PWM, 8-bit
#endif

	// set timer 2 prescale factor to 64
#if defined(TCCR2) && defined(CS22)
	sbi(TCCR2, CS22);
#elif defined(TCCR2B) && defined(CS22)
	sbi(TCCR2B, CS22);
//#else
	// Timer 2 not finished (may not be present on this CPU)
#endif

	// configure timer 2 for phase correct pwm (8-bit)
#if defined(TCCR2) && defined(WGM20)
	sbi(TCCR2, WGM20);
#elif defined(TCCR2A) && defined(WGM20)
	sbi(TCCR2A, WGM20); // ЭТО Phase Correct PWM
//#else
	// Timer 2 not finished (may not be present on this CPU)
#endif

Понятна разница? Впрочем, Вы также можете замерить частоту.

Вернусь сюда ещё раз. Вы - правы, действительно таймер0 настраивается на FastPWM режим, в то время как все остальные таймеры 2,1,3,4,5 на Phase Correct PWM. Не обращал никогда внимание на такую странность, тем не менее, спасибо, она действительно есть. Буду знать, спасибо.

test1
Offline
Зарегистрирован: 06.01.2020

Посмотрел внимательно картинку с осцилографа и всё стало совсем непонятно. Там похоже на соотношение ШИМ для analogWrite(100). И правда, ВЧ заполнение как раз на 0, а не на единице ШИМ, и если там зубья хоть как-то отражают ВЧ заполнение, то он должно быть в районе 20-30кГц или даже выше, для частоты ШИМ в 488.3Гц (таймер3, нога2) .. вообще перестал понимать "что это"

Автор, отзовись, что и как ты решил?

b707
Offline
Зарегистрирован: 26.05.2017

test1 пишет:

Посмотрел внимательно картинку с осцилографа и всё стало совсем непонятно.

главное ТС не написал, с какой ноги эта осциллограмма. Может это вообще не ШИМ....

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

Ребята? Что, коронный вирус действует?

Это же чушь собачья, а ТС - просто дурак или тролль.

Вот, простите "код":

void setup() {
  for (byte i = 2; i < 13; i++) {
    pinMode(i, OUTPUT);
    analogWrite (i, 170);
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

Вот осциллограмма:

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

А теперь рассказываю, откуда у этого дурака "заполнение". Неужто никто еще такого не видел???? (риторический вопрос)

Осциллограф (говенный) питался от говенного импульсного БП. Это заполнение - частота преобразования в БП. Такое на DSO138 часто бывает, если накоромить его от шумного блока питания.

И щтоп вопросов не было это 2560, от Роботдина:

test1
Offline
Зарегистрирован: 06.01.2020

Спасибо. Не, не видел такого ни разу. Видимо не тем осцилом смотрю .. в доступе есть старый добрый С1-фигзнает какой, на ЭЛТ. Там такого не показывают.

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

wdrakula пишет:

Вот осциллограмма:

 

Граф, ты ж, вроде, линуксоид, чего там у тебя иконка MSIE делает? Неужели он и туда пролез?

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

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

wdrakula пишет:

Вот осциллограмма:

 

Граф, ты ж, вроде, линуксоид, чего там у тебя иконка MSIE делает? Неужели он и туда пролез?

под мой осциллограф нет программы под Линукс. Модуль под Sigrok еще не написан. Поэтому стоит виртуалка Вин10 ;)))). А ИЕ на ней - это не просто так. Чортова биржевая программа ВТБ умеет работать ТОЛЬКО под ИЕ, даже не под Эдж. ;))

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

т.с. писал что смотрел осциллографом на сигналы обеих плат ... думаете он разными приборами смотрел ?

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

Komandir пишет:

т.с. писал что смотрел осциллографом на сигналы обеих плат ... думаете он разными приборами смотрел ?

Есть ли у тебя понимание, что никакого драного "заполнения" не бывает. Вообще и никогда?

Если есть, то чем ты интересуешься? Как ТС сумел добиться такой картинки, или откуда у него ошибка в ДНК?

Я не думаю про то, как, чем и в чьей заднице что-то измерял ТС. Картинка из поста с "заполнением" это шум очень плохого питания случающийся на DSO138  и похожих приборах.

Еще вопросы?

Seyran
Offline
Зарегистрирован: 04.08.2017

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

Seyran
Offline
Зарегистрирован: 04.08.2017

Seyran пишет:

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

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

Seyran пишет:

но один холивар  я закрою.

Осцилограмма оказалас глюком моего осцилографа

Каков вопрос - таков и ответ, сам виноват!

А уотт здеся я не соглашуся! Списать неумение работать осциком на его глюки - стандартный ответ ламеров. Ибо  твой осцик "умеет" считать и частоту и коэффициент заполнения ШИМ очень даже точно. Можешь прям инкрементный скетч наваять от 1 до 255 с секундным интервалом и посмотреть, что осцилл кажетъ. Будет 1-в-1. Проверено лично мной уже давным давно!!!

Seyran
Offline
Зарегистрирован: 04.08.2017

wdrakula пишет:

Это же чушь собачья, а ТС - просто дурак или тролль.

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

 

 

Seyran
Offline
Зарегистрирован: 04.08.2017

-NMi- пишет:

Каков вопрос - таков и ответ, сам виноват!

А уотт здеся я не соглашуся! Списать неумение работать осциком на его глюки - стандартный ответ ламеров. Ибо  твой осцик "умеет" считать и частоту и коэффициент заполнения ШИМ очень даже точно. Можешь прям инкрементный скетч наваять от 1 до 255 с секундным интервалом и посмотреть, что осцилл кажетъ. Будет 1-в-1. Проверено лично мной уже давным давно!!!

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