/* * usando PWM no MPlab XC8 * * Compilador : MPlabXC8 * Microcontrolador: 16F877A * Autor: aguivone * Versão: 1 * Data : 12 de março de 2013 */ #include <stdio.h> #include <stdlib.h> #define _XTAL_FREQ 4000000 // cristal de 4 Mhz #include <xc.h> /////////////////////////////////////////////////////////configuraçôes////////////////////////////////////////////////// #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) ///////////////////////////////////////////////////interrupção////////////////////////////////////////////////////////////// void interrupt interrupcao(void)//vetor de interrupção { if(TMR2IF) {//interrupção do timer2 TMR2IF = 0;//não será usado } if(CCP1IF) {//interrupção do ccp1 CCP1IF = 0;//não será usado } } void inicializa_PWM1(char prescaler,char pr2,char postcaler)//prescaler / PR2 / postcaler { switch(prescaler) { case 1: { prescaler = 0; }break; case 4: { prescaler = 1; }break; case 16: { prescaler = 3; }break; } T2CON = (postcaler - 1)<<3; T2CON = T2CON + 4 + prescaler;//o 4 é para habilitar o timer 2 PR2 = pr2; CCP1CON = 0X0F;//habilita pwm CCP1IE = 1;//habilita modulo ccp1 TMR2IE = 1; //habilita timer 2 } void duty_cicle(int valor) { int baixo = (valor << 4)|0X0C;//assim mantem os 4 bits mais baixo como 1100 - modo pwm CCPR1L = valor >> 2; CCP1CON = baixo; } //////////////////////////////////////////////////////Rotina principal/////////////////////////////////////////////////////////////// void main(void) { TRISC = 0; //configura como saida PORTC = 0; // limpar as portas que estão configuradas como saidas inicializa_PWM1(4,250,1);//1khz veja no comentario abaixo "SUGESTÃO DE DEFINES :" PEIE = 1;//habilita interrupção de perifericos do pic GIE = 1; //GIE: Global Interrupt Enable bit // N = (Fosc/(Fpwm * 4 * prescaler)) //N = (4.000.000/(1000*4*1)) = 1000 incrementos duty_cicle(500);//1000 passos ,supondo que se queira 50% basta por a metade deste valor = 500. for(;;) { //faz nada }//loop infinito } /* * */ /*calculos para pwm * * periodo do pwm * * Tpwm = [PR2+1]*4*Tosc*prescaler(do timer2) * * duty cycle * <bits 5e4> * D = (CCPR1L + CCP1CON) * Tosc * prescaler (do timer2) * * numero de passos do pwm * * N = (Fosc/(Fpwm * 4 * prescaler)) */ /* SUGESTÃO DE DEFINES : * use estes valores como referencia * //clock de 4mhz #define PWM_250HZ_CLK4 inicializa_PWM1(16, 250, 1) // #define PWM_500HZ_CLK4 inicializa_PWM1(16, 125, 1) // #define PWM_1KHZ_CLK4 inicializa_PWM1(4, 250, 1) // #define PWM_1K25HZ_CLK4 inicializa_PWM1(16, 50, 1) // #define PWM_2KHZ_CLK4 inicializa_PWM1(4, 125, 1) // #define PWM_2K5HZ_CLK4 inicializa_PWM1(4, 100, 1) // #define PWM_4KHZ_CLK4 inicializa_PWM1(1, 250, 1) // #define PWM_5KHZ_CLK4 inicializa_PWM1(1, 200, 1) // #define PWM_8KHZ_CLK4 inicializa_PWM1(1, 125, 1) // #define PWM_10KHZ_CLK4 inicializa_PWM1(1, 100, 1) // #define PWM_20KHZ_CLK4 inicializa_PWM1(1, 50, 1) // #define PWM_25KHZ_CLK4 inicializa_PWM1(1, 40, 1) // #define PWM_100KHZ_CLK4 inicializa_PWM1(1, 10, 1) // //clock de 8mhz #define PWM_500HZ_CLK8 inicializa_PWM1(16, 250, 1) // #define PWM_1KHZ_CLK8 inicializa_PWM1(16, 125, 1) // #define PWM_2KHZ_CLK8 inicializa_PWM1(4, 250, 1) // #define PWM_2K5HZ_CLK8 inicializa_PWM1(16, 50, 1) // #define PWM_4KHZ_CLK8 inicializa_PWM1(4, 125, 1) // #define PWM_5KHZ_CLK8 inicializa_PWM1(4, 100, 1) // #define PWM_8KHZ_CLK8 inicializa_PWM1(1, 250, 1) // #define PWM_10KHZ_CLK8 inicializa_PWM1(1, 200, 1) // #define PWM_16KHZ_CLK8 inicializa_PWM1(1, 125, 1) // #define PWM_20KHZ_CLK8 inicializa_PWM1(1, 100, 1) // #define PWM_40KHZ_CLK8 inicializa_PWM1(1, 50, 1) // #define PWM_50KHZ_CLK8 inicializa_PWM1(1, 40, 1) // #define PWM_200KHZ_CLK8 inicializa_PWM1(1, 10, 1) // //clock de 16mhz #define PWM_1KHZ_CLK16 inicializa_PWM1(16, 250, 1) // #define PWM_2KHZ_CLK16 inicializa_PWM1(16, 125, 1) // #define PWM_4KHZ_CLK16 inicializa_PWM1(4, 250, 1) // #define PWM_5KHZ_CLK16 inicializa_PWM1(16, 50, 1) // #define PWM_8KHZ_CLK16 inicializa_PWM1(4, 125, 1) // #define PWM_10KHZ_CLK16 inicializa_PWM1(4, 100, 1) // #define PWM_16KHZ_CLK16 inicializa_PWM1(1, 250, 1) // #define PWM_20KHZ_CLK16 inicializa_PWM1(1, 200, 1) // #define PWM_32KHZ_CLK16 inicializa_PWM1(1, 125, 1) // #define PWM_40KHZ_CLK16 inicializa_PWM1(1, 100, 1) // #define PWM_80KHZ_CLK16 inicializa_PWM1(1, 50, 1) // #define PWM_100KHZ_CLK16 inicializa_PWM1(1, 40, 1) // #define PWM_400KHZ_CLK16 inicializa_PWM1(1, 10, 1) // */
Faça uma visita na página do face, basta procurar por microcontroladores-C,e dê um "curtir" assim vc fica por dentro das novidades do blog!
Nenhum comentário :
Postar um comentário
olá,digite aqui seu comentário!