Страница 1 из 1
PIC18F47j53 Аппаратный ШИМ
Добавлено: Пн апр 09, 2018 15:51:56
DarkWolf
Доброго времени суток. Не могу до конца разобраться как запустить аппаратный ШИМ на 100кГц с регулировкой Duty от 0 до 256. Использую компилятор microC
Мой код:
Код: Выделить всё
TRISC=0;
CCP8CON=0b00001100; //CPP8 ШИМ
// выбираю таймеры 2 и 4
CCPTMRS2.C8TSEL0 = 1;
CCPTMRS2.C8TSEL1 = 0;
T4CON=0b00000100; Старт таймера 4
PR4=118; //период таймера 4 устанавливает 100кГц
Код: Выделить всё
//Установка Duty цикла
void PWM_Dutys(char Duty)
{
CCPR8L = Duty;
CCPR8H = 0;
}
Проблема в том что Duty регулируется от 0 до 127.
Re: PIC18F47j53 Аппаратный ШИМ
Добавлено: Вт апр 10, 2018 03:01:53
Аlex
DarkWolf писал(а):Проблема в том что Duty регулируется от 0 до 127.
Дак у Вас период всего 118 (119 тактов), что Вы хотели ... ?
Re: PIC18F47j53 Аппаратный ШИМ
Добавлено: Вт апр 10, 2018 07:17:38
КРАМ
Не совсем так.
В регистре CCPxCON биты DCxB управляют МЛАДШИМИ двумя разрядами дьюти цикла. То есть автор может получить разрешение в 4 раза выше значения PRx.
Re: PIC18F47j53 Аппаратный ШИМ
Добавлено: Вт апр 10, 2018 08:02:51
DarkWolf
[uquote="Аlex",url="/forum/viewtopic.php?p=3350437#p3350437"]
DarkWolf писал(а):Проблема в том что Duty регулируется от 0 до 127.
Дак у Вас период всего 118 (119 тактов), что Вы хотели ... ?[/uquote]
Да, 118 это число тактов при котором частота ШИМ равна 100 kHz. А теперь еще нужно и скважность менять от 0 до 255. Вот тут и чего то не доганяю
Добавлено after 5 minutes 16 seconds:
[uquote="КРАМ",url="/forum/viewtopic.php?p=3350472#p3350472"]Не совсем так.
В регистре CCPxCON биты DCxB управляют МЛАДШИМИ двумя разрядами дьюти цикла. То есть автор может получить разрешение в 4 раза выше значения PRx.[/uquote]
Не уверен что это поможет.. да, используя биты DCxB можно получить значение Duty до 1024, но он же все равно работает до 127.
В даташите написано, что ШИМ использует два таймера. Я так понимаю один для генерации частоты, второй для вариации скважности сигнала. Но вот как ими пользоваться понять пока что не могу.
Re: PIC18F47j53 Аппаратный ШИМ
Добавлено: Вт апр 10, 2018 12:00:55
КРАМ
[uquote="DarkWolf",url="/forum/viewtopic.php?p=3350481#p3350481"]да, используя биты DCxB можно получить значение Duty до 1024, но он же все равно работает до 127.[/uquote]
С какого перепуга?
Общий дьюти разделяется маской на две части. Старшие 8 разрядов уходят в CCPxR, а младшие 2 в DCxB.
Вот и все.
Только в старших разрядах диапазон будет ограничен 0...118. Итого общий диапазон составит 0...472
Все это стандартная и древняя фича Микрочипа в младших ПИКах. Способ получить высокое разрешение ШИМа за счет частоты осциллятора, которая в 4 раза выше системной частоты.
[uquote="DarkWolf",url="/forum/viewtopic.php?p=3350481#p3350481"]А теперь еще нужно и скважность менять от 0 до 255. Вот тут и чего то не доганяю[/uquote]
Есть таймер, который считает от 0 до значения PRx. Цифровой компаратор содержит значение равное состоянию таймера в конце дьюти. Сиречь если в него записать значение большее, чем записано в PRx, мы вообще не получим ШИМа, точнее, дьюти будет равен 100%. Итого, дискретность регулирования через CCPxR составляет 1 единица от 0 до 118. Но каждый дискрет может быть разбит на 4 дискрета с помощью значения в двух битах DCxB.
Re: PIC18F47j53 Аппаратный ШИМ
Добавлено: Вт апр 10, 2018 13:09:52
DarkWolf
[uquote="DarkWolf",url="/forum/viewtopic.php?p=3350481#p3350481"]А теперь еще нужно и скважность менять от 0 до 255. Вот тут и чего то не доганяю[/uquote]
Есть таймер, который считает от 0 до значения PRx. Цифровой компаратор содержит значение равное состоянию таймера в конце дьюти. Сиречь если в него записать значение большее, чем записано в PRx, мы вообще не получим ШИМа, точнее, дьюти будет равен 100%. Итого, дискретность регулирования через CCPxR составляет 1 единица от 0 до 118. Но каждый дискрет может быть разбит на 4 дискрета с помощью значения в двух битах DCxB.[/uquote]
т.е. при PR4 = 118 Максимальная Duty = 472. Это 100%. А как сделать что бы 255 было 100% при частоте сигнала 100kHz ?
Re: PIC18F47j53 Аппаратный ШИМ
Добавлено: Вт апр 10, 2018 13:14:30
КРАМ
Никак. При PR4=118 это невозможно. Возможно интерполировать через таблицу значений, где входной интервал 0...255 будет ПЕРЕСЧИТАН в те значения, которые будут максимально близки требуемым.
Иной вариант - изменить частоту тактирования МК так, чтобы создать ДВОИЧНУЮ кратность (кратность степени двойки: 2, 4, 8, 16 и т.д.) 100 кГц системной частоте контроллера. Ближайшее значение - 100 кГц*64=6,4 МГц. Можно 12,8 МГц. Можно 25,6 МГц. Все.
Re: PIC18F47j53 Аппаратный ШИМ
Добавлено: Вт апр 10, 2018 13:22:54
DarkWolf
Большое спасибо за помощь. Решил сделать в таком виде:
Код: Выделить всё
void PWM_Dutys(char Duty)
{
Duty = Duty/2; // максимальное значение 255/2 = 127
CCPR8L = Duty;
}
Re: PIC18F47j53 Аппаратный ШИМ
Добавлено: Вт апр 10, 2018 13:24:48
КРАМ
И так не выйдет. Реальные изменения будут только в диапазоне 0...118, а в диапазоне 119...127 реальный ШИМ меняться не будет.
Re: PIC18F47j53 Аппаратный ШИМ
Добавлено: Вт апр 10, 2018 13:27:46
DarkWolf
[uquote="КРАМ",url="/forum/viewtopic.php?p=3350746#p3350746"]И так не выйдет. Реальные изменения будут только в диапазоне 0...118, а в диапазоне 119...127 реальный ШИМ меняться не будет.[/uquote]
Да, это я понял. 100% точность не требуется. Так что думаю такое решение подойдет. Еще раз спасибо! Вы очень помогли разобраться в этом вопросе.
Re: PIC18F47j53 Аппаратный ШИМ
Добавлено: Ср апр 11, 2018 08:37:29
Аlex
[uquote="КРАМ",url="/forum/viewtopic.php?p=3350472#p3350472"]Не совсем так.
В регистре CCPxCON биты DCxB управляют МЛАДШИМИ двумя разрядами дьюти цикла. То есть автор может получить разрешение в 4 раза выше значения PRx.[/uquote]
Так то оно так. Я исходил из того, что человек в CCPRL пытается записать число, больше значения PRx, что априори не поддаётся никакой логике.
Про младшие биты не стал поднимать вопрос.
Re: PIC18F47j53 Аппаратный ШИМ
Добавлено: Пт июн 29, 2018 14:10:45
RoboC
Вставлю я сюда свой вопрос.
камень 16f887
Я запускаю аппаратный шим
Код: Выделить всё
CCP1CON = 0b00001100;
PR2=0x3F;
T2CON = 0b00000100;
while (!TMR2IF) TRISC = 0b11011000;
while(!TMR2IF){}
и останавливаю его
TMR2ON = 0; // off PWM
Как сделать так, что бы состояние RC2, при выключении всегда было "0"

?
Re: PIC18F47j53 Аппаратный ШИМ
Добавлено: Пт июн 29, 2018 14:17:23
КРАМ
Вариантов ЧЕТЫРЕ.
1. Останавливать не когда попало, а в фазе ШИМа, где выход - ноль.
2. Вывести на эту ногу ноль в порт еще при инициализации и не менять, а останавливать ШИМ выключением модуля. Автоматически модуль на ноге отключится и нога станет защелкой порта.
3. Если у модуля есть бит отключения выхода ССР от пина, то пункт 2 можно сделать через этот бит.
4. Управлять ногой через TRIS, а саму ногу подтянуть резистором к нулю.