Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

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

Пн апр 09, 2018 15:51:56

Доброго времени суток. Не могу до конца разобраться как запустить аппаратный ШИМ на 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

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 писал(а):Проблема в том что Duty регулируется от 0 до 127.
Дак у Вас период всего 118 (119 тактов), что Вы хотели ... ?

Да, 118 это число тактов при котором частота ШИМ равна 100 kHz. А теперь еще нужно и скважность менять от 0 до 255. Вот тут и чего то не доганяю

Добавлено after 5 minutes 16 seconds:
Не совсем так.
В регистре CCPxCON биты DCxB управляют МЛАДШИМИ двумя разрядами дьюти цикла. То есть автор может получить разрешение в 4 раза выше значения PRx.


Не уверен что это поможет.. да, используя биты DCxB можно получить значение Duty до 1024, но он же все равно работает до 127.

В даташите написано, что ШИМ использует два таймера. Я так понимаю один для генерации частоты, второй для вариации скважности сигнала. Но вот как ими пользоваться понять пока что не могу.

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

Вт апр 10, 2018 12:00:55

да, используя биты DCxB можно получить значение Duty до 1024, но он же все равно работает до 127.

С какого перепуга?
Общий дьюти разделяется маской на две части. Старшие 8 разрядов уходят в CCPxR, а младшие 2 в DCxB.
Вот и все.
Только в старших разрядах диапазон будет ограничен 0...118. Итого общий диапазон составит 0...472
Все это стандартная и древняя фича Микрочипа в младших ПИКах. Способ получить высокое разрешение ШИМа за счет частоты осциллятора, которая в 4 раза выше системной частоты.

А теперь еще нужно и скважность менять от 0 до 255. Вот тут и чего то не доганяю

Есть таймер, который считает от 0 до значения PRx. Цифровой компаратор содержит значение равное состоянию таймера в конце дьюти. Сиречь если в него записать значение большее, чем записано в PRx, мы вообще не получим ШИМа, точнее, дьюти будет равен 100%. Итого, дискретность регулирования через CCPxR составляет 1 единица от 0 до 118. Но каждый дискрет может быть разбит на 4 дискрета с помощью значения в двух битах DCxB.

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

Вт апр 10, 2018 13:09:52

А теперь еще нужно и скважность менять от 0 до 255. Вот тут и чего то не доганяю

Есть таймер, который считает от 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 МГц. Все.
Последний раз редактировалось КРАМ Вт апр 10, 2018 13:40:21, всего редактировалось 1 раз.

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

Вт апр 10, 2018 13:22:54

Большое спасибо за помощь. Решил сделать в таком виде:
Код:
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

И так не выйдет. Реальные изменения будут только в диапазоне 0...118, а в диапазоне 119...127 реальный ШИМ меняться не будет.

Да, это я понял. 100% точность не требуется. Так что думаю такое решение подойдет. Еще раз спасибо! Вы очень помогли разобраться в этом вопросе.

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

Ср апр 11, 2018 08:37:29

Не совсем так.
В регистре CCPxCON биты DCxB управляют МЛАДШИМИ двумя разрядами дьюти цикла. То есть автор может получить разрешение в 4 раза выше значения PRx.

Так то оно так. Я исходил из того, что человек в CCPRL пытается записать число, больше значения PRx, что априори не поддаётся никакой логике.
Про младшие биты не стал поднимать вопрос.

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

Пт июн 29, 2018 14:10:45

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

Код:
      CCP1CON = 0b00001100;
      PR2=0x3F;
   T2CON =  0b00000100;
      while (!TMR2IF) TRISC = 0b11011000;
   while(!TMR2IF){}


и останавливаю его
TMR2ON = 0; // off PWM

Как сделать так, что бы состояние RC2, при выключении всегда было "0" :oops: ?

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

Пт июн 29, 2018 14:17:23

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