Как добиться более высокой частоты ШИМ?

Я использую библиотеки, предоставленные компилятором C18, чтобы открыть и установить рабочий цикл для использования PWM. Я заметил, что максимальная частота ШИМ, которую я могу получить при 100% рабочем цикле, составляет около 13,5 кГц. Чем ниже рабочий цикл, тем выше частота ШИМ. Как я могу достичь более высокой частоты ШИМ при 100% рабочем цикле? Можно ли хотя бы получить более 13,5 кГц? Я просто не могу понять, что мне не хватает, может, здесь кто-то поможет, а я использую PIC18F87J1.

Вот библиотеки компилятора C18 C

Вот таблица данных PIC18F87J1.

Вот фрагмент кода, который я использую для ШИМ.

 TRISCbits.TRISC1 = 0;
 OpenTimer2(TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1);
 OpenPWM2(0x03ff);
 SetDCPWM2(255);

Ваша помощь ценится, спасибо!


person Ammar    schedule 07.05.2014    source источник
comment
То, что рабочий цикл и частота кадров связаны, кажется удивительным, возможно, у вас неправильно настроены таймеры. Говоря в целом, не вдаваясь в подробности вашей платформы, убедитесь, что тактовая частота процессора работает с максимальной частотой, что используется любой доступный множитель тактовой частоты ФАПЧ и что у вас нет системы, периферийных устройств или счетчиков прескалярных вычислений. активны, так как это уменьшит количество часов, идущих на счетчик.   -  person Chris Stratton    schedule 07.05.2014
comment
Тактовая частота процессора составляет 8 МГц, и я не думаю, что у меня есть какой-либо другой активный прескалярный счетчик, который мог бы повлиять на частоту. Я заметил, что изменение предскалярного значения с 1: 1 на 1: 4 или выше дало мне меньшую частоту ШИМ.   -  person Ammar    schedule 07.05.2014
comment
Является ли рабочий цикл и частота ШИМ обратно пропорциональными друг другу?   -  person Ammar    schedule 07.05.2014
comment
Нет, обычно они независимы: один таймер (секция) или режим генерируют общий период, а другой - время включения. Вы уверены, что рабочий цикл существенно меняется, и что вы не просто меняете время, когда период лишь незначительно (на один счет или около того) больше?   -  person Chris Stratton    schedule 07.05.2014
comment
Как я могу получить частоту ШИМ 1 кГц? Изменение открытого таймера2 на следующее дает мне 490 Гц независимо от рабочего цикла. OpenTimer2(TIMER_INT_OFF & T2_PS_1_16 & T2_POST_1_16); Так что теперь мне просто нужно увеличить частоту ШИМ до 1 кГц. Кстати, это нормально, что частота ШИМ не меняется при изменении рабочего цикла, верно?   -  person Ammar    schedule 07.05.2014
comment
Период ШИМ = [(период) + 1] x 4 x TOSC x предварительный делитель TMR2 Таким образом, с 0x3ff (1023) вы получаете коэффициент 4096, в то время как ваши 490 Гц подразумевают коэффициент 16384, оставляя фактор загадки 4, поскольку вы, кажется, не использовать прескаляры? В любом случае, если вы сделаете период меньшим, вы получите более высокую частоту, хотя и более ограниченную степень детализации корректировки, поскольку своевременность может быть не выше, чем период.   -  person Chris Stratton    schedule 07.05.2014
comment
Убедитесь, что ваша настройка регистра OSCCON действительно дает вам 8 МГц. У вашего чипа также есть x4 PLL, если вы начнете использовать его, у вас будет частота 32 МГц и увеличится время или разрешение PWM.   -  person Chris Stratton    schedule 07.05.2014


Ответы (1)


Для начала у вас есть обратные параметры функций. Open () принимает значение char меньше 256, а Set () принимает 10-битное число.

Тем не менее, вы выбрали наибольшее значение (255), которое дает наименьшую частоту. Как поясняется в таблице, функция Open () принимает значение периода в качестве параметра. Более высокая частота эквивалентна более короткому периоду, и наоборот.

Наконец, зачем вам 100% рабочий цикл? Это то же самое, что всегда держать булавку высоко. В этом случае частота вообще не имеет значения. Просто включите контакт и вообще не используйте ШИМ.

Вы не сказали, что вы ведете с этим ШИМ, но, вообще говоря, слишком высокая частота может вызвать проблемы. Это может вызвать радиопомехи, перегрев и т. Д.

Ваш вопрос указывает на то, что вы неправильно понимаете цель ШИМ и то, к чему относятся эти термины, так что вот tl; dr.

ШИМ имитирует напряжение между 0 и Vcc путем быстрого переключения вывода на высокий и низкий уровень. Смоделированное напряжение пропорционально time_high / (time_high + time_low). Процент времени, в течение которого вывод находится в состоянии Vcc, называется рабочим циклом. (Таким образом, 100% -ный режим всегда включен, что дает напряжение Vcc. 0% -ный режим всегда выключен, что дает 0 В.)

Скорость, с которой повторяется этот цикл включения / выключения, называется частотой ШИМ. Если частота слишком мала (период слишком большой), нагрузка будет замечать колебания напряжения на контакте. Цель состоит в том, чтобы запустить ШИМ достаточно быстро, чтобы сгладить напряжение, которое видит нагрузка, но не так быстро, чтобы вызвать другие проблемы. Доступные частоты подходят для большинства приложений. Также обратите внимание, что установка высокого значения частоты (малого периода) также снизит точность рабочего цикла. Это объясняется в таблице данных. Причина в основном в том, что рабочий цикл в конечном итоге должен быть преобразован в такты часов, а не такты часов. Чем выше частота, тем меньше способов разделить такты часов в каждом цикле.

person uncleO    schedule 07.05.2014
comment
490 Гц - это довольно низкая частота кадров, желание работать быстрее, чем обычно - 13,5 кГц не лишено смысла - вероятно, этого можно достичь с помощью тактовой частоты 8 МГц и почти наверняка с помощью тактовой частоты ФАПЧ 32 МГц. Нет, моделирование напряжения - это только одна из целей ШИМ. - person Chris Stratton; 08.05.2014
comment
@ChrisStratton Я думаю, вы допустили ошибку в своем предыдущем комментарии. Open () принимает значение типа char, поэтому 0x3ff не является допустимым вводом. Если он скомпилирован, он будет прочитан как 0xff, что даст другую частоту, чем та, которую вы рассчитали. - person uncleO; 08.05.2014
comment
Да, но это только означает, что расхождение между теорией и наблюдаемым результатом составляет 16x вместо 4x. Есть идеи, откуда берется этот дополнительный фактор по формуле в таблице данных? - person Chris Stratton; 08.05.2014
comment
@ChrisStratton Я получаю 490 Гц из формулы. 8000000 / (256 * 4 * 16) = 488. Какой у вас вопрос? - person uncleO; 08.05.2014
comment
Как вы думаете, что вызывает множитель 16? 4 встроено в формулу, но плакат, кажется, устанавливает все предварительные делители на 1: 1 - вы видите в этом ошибку? Если этот множитель 16 может быть устранен, они будут ближе к цели, хотя для ее достижения, я думаю, им понадобится система ФАПЧ для увеличения тактовой частоты источника (32M / 2/4/256 = 15,625 кГц, встреча по крайней мере более 13,5 КГц - person Chris Stratton; 08.05.2014
comment
@ChrisStratton, в исходном посте я не использовал никаких прескаляров, но в комментариях выше под моим вопросом, где я разговаривал с вами, я использовал прескалярные значения 1:16, что дало мне 490 Гц. Надеюсь, путаницы нет. Затем я спросил вас, как поднять его примерно до 1 кГц. - person Ammar; 08.05.2014
comment
Привет, Аммар. Чтобы установить частоту на 1 кГц, используйте формулу для установки соответствующего периода. Использование числа в функции open () будет зависеть от ваших предварительных степеней. 1 кГц означает период в 1 миллисекунду или 1000 микросекунд. Tosc составляет 0,125 микросекунды. Если вы установите предскаляр на 1:16, ввод 125 должен дать вам желаемую частоту. - person uncleO; 08.05.2014
comment
@UncleO, я понимаю ваш ответ и сообщение выше. Я изменю период на 125 завтра, тогда я подтвердю, все ли работает, как ожидалось. А пока вы оба заслуживаете одобрения. - person Ammar; 08.05.2014
comment
Ой! Я забыл +1 в формуле. Номер, который вы хотите использовать, - 124. Извините. - person uncleO; 08.05.2014
comment
@UncleO частота ШИМ действительно работала, изменив период на 124. Еще один вопрос, означает ли это, что рабочий цикл должен быть меньше 124? Значит, для этой функции SetDCPWM2(duty-cycle); должно быть установлено значение 124 или меньше, верно? Рабочий цикл не превышает периода, верно? - person Ammar; 08.05.2014
comment
Документация запутанная и противоречивая, поэтому вам придется поэкспериментировать. Я предполагаю, что есть дополнительный коэффициент 4, так что рабочий цикл должен быть меньше 500 = 125 * 4 (но, возможно, меньше 496). Попробуйте 250 и посмотрите, измеряется ли напряжение на контакте как Vcc / 2. - person uncleO; 08.05.2014