Можно сразу воспользоваться готовой библиотекой PWM, которая упрощает использование PWM HardWare модуля.
"PWM Library
CCP module is available with a number of PIC MCUs. mikroC PRO for PIC provides library which simplifies using PWM HW Module.
Note: Some MCUs have multiple CCP modules. In order to use the desired CCP library routine, simply change the number 1 in the prototype with the appropriate module number, i.e. PWM2_Start();
Library Routines
PWM1_Init
PWM1_Set_Duty
PWM1_Start
PWM1_Stop"
Более подробно смотреть во встроенном хелпе на микроС.
Всего таких PWM - 5 штук. Соответственно меняется цифра 1 на другую.
...
PWM1_Initпрототип - void PWM1_Init(
const long freq);
Перевод Гугль: Инициализирует PWM модуль со скважностью 0. Параметр
freq является искомой PWM частотой в Гц (см. лист данных устройства для правильного значения в связи с частотой кварца FOSC).
Эта процедура должна быть вызвана перед использованием других функций из библиотеки PWM.
Требуется использовать микроконтроллер с CCP модулем.
Расчет значения частоты ШИМ осуществляется
компилятором. Таким образом, компилятор должен знать значение параметра во время компиляции, именно поэтому этот параметр необходимо объявить const константой, а не переменной.
Пример инициализации PWM модуля с частотой 5КГц:
- Код: Выделить всё • Развернуть
PWM1_Init(5000);
Добавлено спустя 19 минут 59 секунд:Re: Управление сервой с помощью потенциометра. МК PIC16F, язык СPWM1_Set_DutyПеревод Гугль:
Прототип - void PWM1_Set_Duty(
unsigned short duty_ratio);
PWM скважность. Переменная duty_ratio принимает значения от 0 до 255, где 0 0%, 127 составляет 50%, и 255 = 100% скважностью. Другие конкретные значения скважности может быть рассчитана как (в процентах * 255) / 100.
PWM1_Init должна быть вызвана перед использованием этой процедуры. Пример: Установить скважность 75%:
- Код: Выделить всё • Развернуть
PWM1_Set_Duty (192);
Добавлено спустя 2 минуты 4 секунды:Re: Управление сервой с помощью потенциометра. МК PIC16F, язык ССтарт и стоп описывать смысла нет и так понятно
PWM1_Start и
PWM1_StopДобавлено спустя 1 минуту 40 секунд:Re: Управление сервой с помощью потенциометра. МК PIC16F, язык СПеревод Гугль:
Пример библиотеки
Например, изменения PWM соотношение долг на RC1 и RC2 булавки постоянно. Если светодиод, связанных с этими контакта, можно наблюдать постепенное изменение излучаемого света.
- Код: Выделить всё • Развернуть
unsigned short current_duty, old_duty, current_duty1, old_duty1;
void InitMain() {
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0;
PORTA = 255;
TRISA = 255; // configure PORTA pins as input
PORTB = 0; // set PORTB to 0
TRISB = 0; // designate PORTB pins as output
PORTC = 0; // set PORTC to 0
TRISC = 0; // designate PORTC pins as output
PWM1_Init(5000); // Initialize PWM1 module at 5KHz
PWM2_Init(5000); // Initialize PWM2 module at 5KHz
}
void main() {
InitMain();
current_duty = 16; // initial value for current_duty
current_duty1 = 16; // initial value for current_duty1
PWM1_Start(); // start PWM1
PWM2_Start(); // start PWM2
PWM1_Set_Duty(current_duty); // Set current duty for PWM1
PWM2_Set_Duty(current_duty1); // Set current duty for PWM2
while (1) { // endless loop
if (RA0_bit) { // button on RA0 pressed
Delay_ms(40);
current_duty++; // increment current_duty
PWM1_Set_Duty(current_duty);
}
if (RA1_bit) { // button on RA1 pressed
Delay_ms(40);
current_duty--; // decrement current_duty
PWM1_Set_Duty(current_duty);
}
if (RA2_bit) { // button on RA2 pressed
Delay_ms(40);
current_duty1++; // increment current_duty1
PWM2_Set_Duty(current_duty1);
}
if (RA3_bit) { // button on RA3 pressed
Delay_ms(40);
current_duty1--; // decrement current_duty1
PWM2_Set_Duty(current_duty1);
}
Delay_ms(5); // slow down change pace a little
}
}
P.S.: пример сам не проверял...