2016-05-06 16 views
0

Я знаю, что в Интернете есть много примеров, но для чего нужен этот код для работы?Почему эта простая PWM не работает в xc8

Часто Задаваемые осциллятор = 4МГц

= 0.25us Период

duty_cicle = 250

Prescale = 16

PR2 = 124

#include <xc.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <pic16f88.h> 

#pragma config FOSC = HS // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN) 
#pragma config WDTE = OFF  // Watchdog Timer Enable bit (WDT disabled) 
#pragma config PWRTE = OFF  // Power-up Timer Enable bit (PWRT disabled) 
#pragma config MCLRE = OFF  // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD) 
#pragma config BOREN = ON  // Brown-out Detect Enable bit (BOD enabled) 
#pragma config LVP = OFF  // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming) 
#pragma config CPD = OFF  // Data EE Memory Code Protection bit (Data memory code protection off) 
#pragma config CP = OFF   // Flash Program Memory Code Protection bit (Code protection off) 

void main() 
{ 
    while (1) 
    { 
      CCP1CON = 0x2C; /*activate PWM mode*/ 
      PR2 = 0x7C; /*124 (DECIMAL)*/ 
      T2CON = 0X06; /*prescale 16 */ 
      CCPR1L = 0X3E; 

    }  
} 

Я хочу видеть:

Период ШИМ = 2 мс

Dutycicle = 1 мс

Sincerilly NIN

ответ

0

В начало страницы: Не включайте pic16f88.h, он включен в xc.h.

Немного больше темы: Если вы используете более современную деталь (например, PIC16f1619), вы можете использовать конфигуратор кода MPLAB для создания кода TMR2 и CCP для вас. Это также будет стоить дешевле и иметь больше flash/ram. Это устройство находится на curiosity board (20 долларов США).

По теме: Ваша первая остановка - datasheet.

Секция ШИМ имеет setup for PWM operation.

Этап 1: timer 2 принимает Fosc/4 в качестве входного сигнала, который равен 1 МГц в вашем случае. Целевая частота составляет 500 Гц. 1e6/500 = 2k. Я бы предложил предварительный делитель 16 и значение pr 125. Это даст вам ровно 500 Гц.

Шаг 2: Мы хотим 50% -ный рабочий цикл. CCP1L floor (125/2) = 62. CCP1X: CCP1Y = 0,5 * 4 = 2.

Шаг 3: Очистить бит триса.

Step4 и 5: Включите его

// Step 1 
TMR2ON = 0; 
TOUTPS = 0; 
T2CKPS = 2; 
PR2 = 250U; 

// Step 2 
CCP1L = 62U; 
CCP1X = 1; 
CCP1Y = 0; 

// Step 3 
TRISB3 = 0; 

// Step 4 
TMR2ON = 1; 

// Step 5 
CCP1M = 0xC; 

Надежда, что помогает.

0

техническое описание состояния:

В Pulse-Width Режим модуляции (ШИМ), то CCP1 контактный производит до выхода PWM с 10-разрядным разрешением. Начиная с контакт CCP1 мультиплексируется с защелкой данных PORTB, бит TRISB должен быть очищен, чтобы вывести вывод CCP1 .

Таким образом, вы должны установить битое TRIS для CCP1 штифта для вывода:

TRISB &= ~(1 << 3); //Clear bit RB3/CCP1 in TRISB, makes PORTB3/CCP1 output. 

CCPMX: CCP1 Pin Selection bit Это предполагает, в слове конфигурации ясно. Если установлено, то CCP1 находится на RB0 вместо RB3, но, поскольку я не вижу упоминания о CCPMX в вашей конфигурации, я предполагаю, что он очищен.

+0

Hi. Я не работаю. Несмотря на то, что ваше упражнение выполняется XC8. Я поместил ваше упражнение после «while (1)». В чем проблема? – NIN