2016-05-06 32 views
0

我知道互聯網上有很多例子,但是需要這些代碼才能工作?爲什麼這個簡單的PWM不能在xc8中工作

frecuency振盪器= 4MHz的

periode = 0.25us

duty_cicle = 250

預分頻= 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; 

    }  
} 

我想見:

週期PWM的= 2ms的

Dutycicle = 1毫秒

Sincerilly NIN

回答

0

首題主題: 不包含pic16f88.h,它包含在xc.h中。

更多的主題: 如果您使用更現代的部分(例如PIC16f1619),則可以使用MPLAB代碼配置器爲您生成TMR2和CCP代碼。它也會花費更少,並擁有更多的閃存/內存。該設備在curiosity board(20美元)。

關於主題: 您的第一站是datasheet

PWM部分有setup for PWM operation

步驟1: timer 2以Fosc/4爲輸入,在您的情況下爲1mhz。 目標頻率是500Hz。 1e6/500 = 2k。 我建議預分頻器爲16,pr值爲125.這會給你準確的500Hz。

第二步: 我們想要一個50%的佔空比。 CCP1L floor(125/2)= 62. CCP1X:CCP1Y = 0.5 * 4 = 2.

第3步: 清除tris位。

步驟4和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

數據表中指出:

在脈寬調製(PWM)模式下,CCP1銷 產生高達10位分辨率的PWM輸出。由於 CCP1引腳與PORTB數據鎖存器 複用,必須清零TRISB位以使CCP1 引腳爲輸出。

所以,你必須爲CCP1引腳的TRIS位設置爲輸出:

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

這在配置字假設CCPMX: CCP1 Pin Selection bit是明確的。如果設置,那麼CCP1在RB0而不是RB3,但由於我沒有看到你的配置編譯指示中的CCPMX,我認爲它被清除。

+0

嗨。我不工作。即使你的instruccion是由XC8執行的。我在「while(1)」之後放置了你的instruccion。會有什麼問題? – NIN

相關問題