如题,在用PIC16F15345学习PWM时,无法输出PWM波形,各位大神帮忙看看是哪里有问题。
1.端口配置
void GPIO_Config(void)
{
TRISBbits.TRISB6 = 0;//输出
ANSELBbits.ANSB6 = 0;//数字模式
RB6PPS = 0X0B;//RB6作为PWM3OUT
TRISBbits.TRISB4 = 0;//输出
ANSELBbits.ANSB4 = 0;//数字模式
RB4 =1;
SLRCONBbits.SLRB4 =0;//以最快速度翻转
}
2.Timer2配置
void Timer2_SoftwareGate(void)
{
T2CLKCONbits.CS =2;//Timer2时钟源选择,fosc
T2CONbits.CKPS = 0;//时钟预分频,128分频
T2CONbits.OUTPS =1;//输出后分频
T2HLTbits.CKPOL = 0;//输入时钟有效边沿,0-上升沿,1-下降沿
T2HLTbits.CKSYNC = 1;//TMER时钟同步
T2HLTbits.PSYNC = 0;//TMER分频输出与fosc/4同步
T2HLTbits.MODE = 0x0;//自由运行模式,软件控制
T2RSTbits.RSEL = 0;//TIMER2外部复位源选择
T2PR = 200;
T2CONbits.ON =1;//启动
}
3.PWM配置
void PWM_Config(void)
{
PWM3CONbits.POL =0;//高有效
PWM3DCHbits.DC = 0x0F;
PWM3DCLbits.DC = 0X03;
PWM3CONbits.EN = 1;
}
4.中断配置
使能TIMER2中断,并在中断中翻转RB4端口。
void Interrput_Config(void)
{
INTCONbits.GIE =1;
INTCONbits.PEIE = 1;
PIE4bits.TMR2IE =1;//使能timer2中断
PIR4bits.TMR2IF =0;//中断标志位清0
}
void __interrupt() IRS(void)
{
if(PIE4bits.TMR2IE && PIR4bits.TMR2IF)
{
RB4=~RB4;
PIR4bits.TMR2IF=0;
}
else
{}
}
5.主函数
void main(void)
{
CLCK_Internal_Config();//32M时钟
GPIO_Config();
PWM_Config();
Timer2_SoftwareGate();
Interrput_Config();
while(1)
{
}
return;
}
可以测得TIMER2在按配置的T2PR = 200产生中断,但在RB6脚上没有PWM波形输出,换了其他的引脚试了,也不能输出波形,是哪些配置不对吗?求赐教,万分感谢!
|