ATMEGA2560 - изменение разрядности и частоты ШИМ (Timer1)?

М__

✩✩✩✩✩✩✩
27 Апр 2021
5
0
ATMEGA 2560 - никак не получается задать изменение возможной разрядности, pin11
то есть

pinMode(11,OUTPUT);
TCCR1A = TCCR1A & 0xFC | 0x03; // задание разрядности 0..1023
TCCR1B = TCCR1B & 0xF8 | 0x01; // задание делителя частоты
analogWrite(11, 254);

на выходе получаем почти 5В, а должно быть вроде как 1.25В ??? если разрядность ШИМ меняется?
Или я чего то так и не понимаю???

Помогите советом, кто знает. Обратите внимание - вопрос для MEGA2560.

Надеюсь на помощь.
М.
 

poty

★★★★★★✩
19 Фев 2020
3,262
949
Функции, доступные в стандартных библиотеках, рассчитаны на стандартные же настройки портов. В частности, функция analogWrite в качестве второго параметра принимает число от 0 до 255, а не 0 - 1023. Если Вы уходите от стандарта, то и скважность должны устанавливать напрямую через регистры.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,703
474
на выходе получаем почти 5В, а должно быть вроде как 1.25В
С чего бы?:rolleyes:
Вы снизили разрядность счётчика таймера скважности до 3-х, верно? Значит, диапазон чисел задания скважности шим уменьшился до диапазона от 0 до 23 - 1 = 7. Вы задали число 254, но значащие разряды у него теперь только младшие 3, от 0-го до 2-го, остальные 5 старших разрядов уже ни на что не влияют. Значения 3-х младших разрядов для десятичного числа 254 это 110, что в десятичной системе 6. Следовательно, действующее значение выходного напряжения шим будет 6/7*5 вольт = 4,29 вольта. Изучайте Булеву алгебру и не эабывайте о золотом правиле " Не знаешь - не лезь! ".;) А это Ваше
есть погрешность прибора и метода измерения. Так-то. :D :D :D
 
Изменено:

М__

✩✩✩✩✩✩✩
27 Апр 2021
5
0
>> Вы снизили разрядность счётчика таймера скважности до 3-х, верно?
Неет .... по datasheet TCCR1A биты 1-0 WGM11 WGM10, которые задают так называемую Waveform Generation Mode,
как я думаю по даташиту выбор 0x03 - это "PWM, Phase Correct, 10-bit 0x03FF TOP BOTTOM"

/* - небольшая вырезка из даташита стр.145
Table 17-2. Waveform Generation Mode Bit Description(1)
WGMn1 (PWMn1) WGMn0 (PWMn0)
0 0 0 0 Normal 0xFFFF Immediate MAX
0 0 0 1 PWM, Phase Correct, 8-bit 0x00FF TOP BOTTOM
0 0 1 0 PWM, Phase Correct, 9-bit 0x01FF TOP BOTTOM
0 0 1 1 PWM, Phase Correct, 10-bit 0x03FF TOP BOTTOM
*/

Хм. может я не верно поставил вопрос?
Ладно, попробую проще.
Суть: есть ардуино ATMEGA2560. Нужно задать максимально возможную частоту ШИМ (на Timer1), и чтобы управлять им в диапазоне 0..1023.
то есть КАК НАСТРОИТЬ РЕГИСТРЫ, чтобы частота ШИМ была максимальной, и изменять скважность с шагом 1/1024, а не 1/255 ?
Если конешно это возможно....

(по поводу 5В и 1.25В я имел ввиду, что при стандартной установке 254 - почти максимальное значение ШИМ (когда шаг 1/255) ~100%,
а при разрядности ШИМ 1024, код 254 соответсвенно ~25% ШИМ)

Честно говоря, я как-то надеялся на подсказку, КАК это сделать :) Есть советы?
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
3,066
915
регистры неверно меняете, вот так попробуйте
TCCR1A = 0x03; // задание разрядности 0..1023
TCCR1B = 0x01; // задание делителя частоты
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,412
978
58
Марий-Эл
Что вы гадаете что и как делать?
Взяли даташит на микросхему. Почитали раздел таймеры.
И запрограммировали таймер как надо.
 

М__

✩✩✩✩✩✩✩
27 Апр 2021
5
0
>Взяли даташит на микросхему. Почитали раздел таймеры.
>И запрограммировали таймер как надо.
Очень умный ответ.... Только помощи от него никакой. :( Ладно. Проехали.

вообщем после долгих разборок вышло так:
TCCR1A=(1<<COM1A1)|(0<<COM1A0)|(1<<WGM11)|(1<<WGM10); //Phase correct PWM // разрядность 0..1023

установка подключений для pin11 - это COM1A1 этот бит должен быть 1, WGM11, WGM10 - тоже должны быть в 1, и тогда макс значение для ШИм будет 0..1023
Только в этом случае при постановке делителя частоты в 1
TCCR1B = 0x01; // задание делителя частоты
чтото не получилось использовать такое разрешение. Но вроде бы вопрос снят....
В моём случае изменение частоты не критично, важнее было уменьшить шаг ШИМ, для точной настройки выхода
 

bort707

★★★★★★✩
21 Сен 2020
3,066
915
вообщем после долгих разборок вышло так:
TCCR1A=(1<<COM1A1)|(0<<COM1A0)|(1<<WGM11)|(1<<WGM10); //Phase correct PWM // разрядность 0..1023
слушайте, товарищ, если вы не готовы сами читать даташит - то хотя бы слушайте чужие советы.
я вам в #5 написал как надо - вы хотя бы попробуйте
 

М__

✩✩✩✩✩✩✩
27 Апр 2021
5
0
Хм. Как обычно, простой вопрос вызвал срач :)
Остыньте.
Конешно, решение вопроса началось с просмотра рекомендаций и изучения datasheeta ATMEGA2560. Только вот не получалось как-то.
Потому и задал вопрос.
Как я и говорил, решение для поставленной задачи носит установку регистра TCCR1A в состояние 0В10000011, если используется только pin11,
в принципе COM1A
pinMode(11,OUTPUT);
TCCR1A = TCCR1A & 0xF8 | 0x03; //Phase correct PWM // разрядность 0..1023 // TOP = 0x3FF == 1023
TCCR1B = TCCR1B & 0xF8 | 0x01; // задание делителя частоты,
// analogWrite(11, 254); // или OCR1A=254, если используется регистр, связанный с таймером1
OCR1A = 254; // задание скважности (254/1023 = ~25%)

В данном случае частота по осциллографу ~8/КГц
при TCCR1B = TCCR1B & 0xF8 | 0x02; // задание делителя частоты
частота почти в 8 раз меньше ~1.5Кгц

В данном случае всё было верно, просто отрабатывающий элемент не совсем верно отрабатывал на частоте более 5кГц, потому и возникло сильное сомнение в решении. После контроля осциллограммой всё стало наглядно видно.

Считаю вопрос закрытым.
А ваши комментарии не по теме и высказывания о других... Оставьте пжлста в других местах.
"Изучайте Булеву алгебру и не эабывайте о золотом правиле " Не знаешь - не лезь! " - в корне не верно; "если в чем то не разбираешься - разберись :)"
Кстати, по поводу #5 - первое, что сделал - это попробовал, у меня он не заработал, но либо это было связано с описанным выше моментом, либо по тому, что COM1A при TCCR1A = 0x03 сбрасывается в 0 и не отрабатывается для него?
Но это уже совсем будет другая история :)
Надеюсь никого не обидел :)
Прошу закрыть тему.
 
Изменено: