Сделать ШИМ на определенной частоте с фазовым сдвигом

RNGEESUS13

✩✩✩✩✩✩✩
2 Дек 2024
4
0
Добрый день, не могу найти внятной информации. Нужно сделать ШИМ именно на 5 и 6 пине Ардуино Уно. Частота ШИМа должна быть 62.5 кГц, причем на 6 пине эта же частота с фазовым сдвигом на 180 градусов.
Сделать надо через регистры, но я совсем не знаком с регистрами, т.к только начал знакомство с МК.

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

Все что собрал по кусочкам с интернета, делает нужную частоту, но нет сигнала на 6 пине и без смещения по фазе, понятное дело:
TCCR0A = bit(COM0A1) | bit(COM0B1) | bit(WGM01) | bit(WGM00);
TCCR0B = bit(CS00);
OCR0A = 255;
OCR0B = 63;
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
499
147
@RNGEESUS13,
Информацию можно черпать
  • из даташита. На ATmega328 он относительно несложный.
  • из уроков (лекций) которые вам давали
  • из уроков (статей) в интернете - стоит найти подходящий вам по стилю. Например много лет назад был популярен ресурс https://easyelectronics.ru/avr-uchebnyj-kurs-ispolzovanie-shim.html
  • найти готовый пример (очень вероятно, что он где то есть).

Если у вас меандр, то может подойти и режим FastPWM.
Если скважность может меняться, то наверное Phase Correct PWM (но 62.5 кГц может не получиться).
(кратко описано в ссылке выше).

П.С. Показать как это сделать не могу.
 

bort707

★★★★★★✩
21 Сен 2020
3,067
915
Что такое "смещение по фазе на 180"? Уверены, что вам нужно именно смещение, а не инвертированный ШИМ по второму каналу?
 

RNGEESUS13

✩✩✩✩✩✩✩
2 Дек 2024
4
0
@bort707,да, тут был неправ, противофазным шим, на одном выводе обычный ШИМ, на втором инвертированный, а не смещение.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,975
634
45
@RNGEESUS13, Взять обычный ШИМ и логический элемент НЕ, ну или на транзисторе сделать его аналог.
 

bort707

★★★★★★✩
21 Сен 2020
3,067
915
на одном выводе обычный ШИМ, на втором инвертированный,
ну тогда это легко. По одному каналу прямой ШИМ, во второму обратный
OCR по обоим каналам должен быть одинаков или OCR0B на несколько единиц больше OCR0A, если вы хотите иметь задержку между переключением каналов:

C++:
TCCR0A = (1 << WGM01) | (1<< WGM00);      // fast PWM
TCCR0A | = (1 << COM0A1);                 // non-invert PWM on chA
TCCR0A | = (1 << COM0B1) | (1 << COM0B0); // invert PWM on chB
OCR0A = 63;
OCR0B = 66;
TCCR0B = bit(CS00);                       // start timer
 
Изменено:

RNGEESUS13

✩✩✩✩✩✩✩
2 Дек 2024
4
0
@bort707, а вот кстати нет, на 5 выводе ШИМ с изменяющейся частотой до 1МГц прыгает, а на 6 вообще шум до 100мВ