📄 epwmdemo.c
字号:
#include <pic18.h>
#include <stdio.h>
void interrupt ISR(void);
void init(void);
void set_new_mode(void);
extern void update_pwm(void);
unsigned char ACTIVE_PINS_MODE;
unsigned char BRIDGE_MODE;
void main(void)
{
unsigned char oldmode;
unsigned char oldoutput;
init();
while(1)
{
ACTIVE_PINS_MODE=((PORTC&0x0C)>>2); //read the DIP switches to get modes
BRIDGE_MODE=(PORTC&0x03);
update_pwm();
if((ACTIVE_PINS_MODE!=oldmode)||(BRIDGE_MODE!=oldoutput)) // if either has changed...
set_new_mode(); // ...update these changes
oldmode=ACTIVE_PINS_MODE;
oldoutput=BRIDGE_MODE;
}
}
void init(void)
{
GIE=1; // interrupts enabled
IPEN=0;
TXEN=1; /* enable serial port transmissions */
SPEN=1;
TXIE=0; /* not interrupt driven */
TRISC=0xBF;
TRISD=0x0F;
TRISA=0xFF;
RBIE=1;
ECCPAS=0b00000000; // autoshutdown event select
T1CON=0b10000101;
T3CON=0b10111101;
T2CON=0x05; // TMR2 drives PWM
ECCP1IE=1;
ECCP1IF=0;
ECCPR1=0x01000;
ECCP1CON=0x0C;
}
void interrupt ISR(void)
{
}
void putch(unsigned char c)
{
TXREG=c; /* transmit a character to Serial IO */
while(!TXIF)continue;
TXIF=0;
}
void set_new_mode(void)
{
// print what new mode has been selected
printf("\rPWM: ");
switch(BRIDGE_MODE)
{
case 1:
printf("Full-Bridge FWD |");
break;
case 2:
printf("Half-Bridge |");
break;
case 3:
printf("Full-Bridge REV |");
break;
default:
printf("Single Output |");
break;
}
switch(ACTIVE_PINS_MODE)
{
case 1:
printf(" A&C[HI] B&D[LO] |");
break;
case 2:
printf(" A&C[LO] B&D[HI] |");
break;
case 3:
printf(" A&C[LO] B&D[LO] |");
break;
default:
printf(" A&C[HI] B&D[HI] |");
break;
}
/* update mode */
ECCP1CON=((ECCP1CON&0xFC)+ACTIVE_PINS_MODE);
/* update output mode */
ECCP1CON=((ECCP1CON&0x3F)+(BRIDGE_MODE<<6));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -