PIC18F47j53 Аппаратный ШИМ

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

PIC18F47j53 Аппаратный ШИМ

Сообщение 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.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC18F47j53 Аппаратный ШИМ

Сообщение Аlex »

DarkWolf писал(а):Проблема в том что Duty регулируется от 0 до 127.
Дак у Вас период всего 118 (119 тактов), что Вы хотели ... ?
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC18F47j53 Аппаратный ШИМ

Сообщение КРАМ »

Не совсем так.
В регистре CCPxCON биты DCxB управляют МЛАДШИМИ двумя разрядами дьюти цикла. То есть автор может получить разрешение в 4 раза выше значения PRx.
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: PIC18F47j53 Аппаратный ШИМ

Сообщение 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.

В даташите написано, что ШИМ использует два таймера. Я так понимаю один для генерации частоты, второй для вариации скважности сигнала. Но вот как ими пользоваться понять пока что не могу.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC18F47j53 Аппаратный ШИМ

Сообщение КРАМ »

[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.
Реклама
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: PIC18F47j53 Аппаратный ШИМ

Сообщение 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 ?
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC18F47j53 Аппаратный ШИМ

Сообщение КРАМ »

Никак. При PR4=118 это невозможно. Возможно интерполировать через таблицу значений, где входной интервал 0...255 будет ПЕРЕСЧИТАН в те значения, которые будут максимально близки требуемым.
Иной вариант - изменить частоту тактирования МК так, чтобы создать ДВОИЧНУЮ кратность (кратность степени двойки: 2, 4, 8, 16 и т.д.) 100 кГц системной частоте контроллера. Ближайшее значение - 100 кГц*64=6,4 МГц. Можно 12,8 МГц. Можно 25,6 МГц. Все.
Последний раз редактировалось КРАМ Вт апр 10, 2018 13:40:21, всего редактировалось 1 раз.
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: PIC18F47j53 Аппаратный ШИМ

Сообщение DarkWolf »

Большое спасибо за помощь. Решил сделать в таком виде:

Код: Выделить всё

void PWM_Dutys(char Duty)
{
    Duty = Duty/2;           // максимальное значение 255/2 = 127
    CCPR8L = Duty;
}
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC18F47j53 Аппаратный ШИМ

Сообщение КРАМ »

И так не выйдет. Реальные изменения будут только в диапазоне 0...118, а в диапазоне 119...127 реальный ШИМ меняться не будет.
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: PIC18F47j53 Аппаратный ШИМ

Сообщение DarkWolf »

[uquote="КРАМ",url="/forum/viewtopic.php?p=3350746#p3350746"]И так не выйдет. Реальные изменения будут только в диапазоне 0...118, а в диапазоне 119...127 реальный ШИМ меняться не будет.[/uquote]
Да, это я понял. 100% точность не требуется. Так что думаю такое решение подойдет. Еще раз спасибо! Вы очень помогли разобраться в этом вопросе.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC18F47j53 Аппаратный ШИМ

Сообщение Аlex »

[uquote="КРАМ",url="/forum/viewtopic.php?p=3350472#p3350472"]Не совсем так.
В регистре CCPxCON биты DCxB управляют МЛАДШИМИ двумя разрядами дьюти цикла. То есть автор может получить разрешение в 4 раза выше значения PRx.[/uquote]
Так то оно так. Я исходил из того, что человек в CCPRL пытается записать число, больше значения PRx, что априори не поддаётся никакой логике.
Про младшие биты не стал поднимать вопрос.
Аватара пользователя
RoboC
Мудрый кот
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк
Контактная информация:

Re: PIC18F47j53 Аппаратный ШИМ

Сообщение RoboC »

Вставлю я сюда свой вопрос.
камень 16f887
Я запускаю аппаратный шим

Код: Выделить всё

   	CCP1CON = 0b00001100;
   	PR2=0x3F;
	T2CON =  0b00000100; 
		while (!TMR2IF) TRISC = 0b11011000; 
	while(!TMR2IF){}
и останавливаю его
TMR2ON = 0; // off PWM

Как сделать так, что бы состояние RC2, при выключении всегда было "0" :oops: ?
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC18F47j53 Аппаратный ШИМ

Сообщение КРАМ »

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

Вернуться в «PIC»