此帖出自单片机论坛
最新回复
使用的是PIC16F677这款单片机
我采用了TMR2定时器的PWM输出,功能要求就是正占空比是100uS,然后频率可调节,从1k到3k的频率调节,然后我采用的是通过定时器1进行10ms的定时,在中断服务函数中进行处理,直接将PR2的值进行改变来实现频率的调节,在主函数中 通过操作 PSTRCONbits.STRB = 1; T2CONbits.TMR2ON = 1; 来开启PWM输出 ,通过 PSTRCONbits.STRB = 0; T2CONbits.TMR2ON = 0;来关闭PWM输出。
然后出现就是在输出PWM波形的时候会出现有1.3ms的持续低电平没有输出,如示波器图片所示。
////////////////////////////////////////////////////////////////////////
void TMR2_Initialize(void)///这是TMR2的初始化函数, 主频为1M
{
T2CON = 0x00;
TMR2 = 0x00;
// PR2 = 0x00;
INTCONbits.PEIE = 1;
PIE1bits.TMR2IE = 0;
PIR1bits.TMR2IF = 0;
PSTRCON = 0x00;
CCP1CON = 0x0c;
CCPR1L =0x19;
}
////////////////////////////////////以下是对PR2 的操作 在定时器1 操作 10ms进一次中断服务函数
unsigned char pr2num;
unsigned char setp_num = 1;
unsigned char PWM_FREQL = 249; //1Khz 低频率的赋值
unsigned char PWM_FREQH = 60; //3.5kHZ 3521hz 高频率的赋值
void TMR1_Initialize(void)
{
T1CON = 0x00;//T1时钟不分频 fosc/4 公式 65536-(X/4)
TMR1H = 0x00; //1S定时初值0
TMR1L = 0x00;
PIE1bits.TMR1IE = 1;
PIR1bits.TMR1IF = 0;
INTCONbits.PEIE = 0; //外设中断关闭
}
void TMR1_ISR (void) //未使用
{
TMR1H = 0xF6;//10ms
TMR1L = 0x3C;
flag_tick_count++;
if(PWMOUT_on == 1) //如果主函数中的PWMOUT_on =1 即开启PWM输出从1k-3.3k 变化即PR2-减后+
{
if(PWMOUT_up_dowm == 0)
{
pr2num -= setp_num;
if(pr2num <= PWM_FREQH)
{
PWMOUT_up_dowm = 1;
}
}
else
{
pr2num += setp_num;
if(pr2num >= PWM_FREQL)
{
PWMOUT_up_dowm = 0;
}
}
PR2 = pr2num;
}
}
////////////////////////////////////////////以下是主函数中刚才所说的PWM开启和关闭 的操作
if(pwm_start == 1)// PWM开启时 pwm_start =1 关闭时=0
{
if(PWMOUT_on == 0)
{
PWMOUT_on = 1;
TMR2 = 0;
pr2num= PWM_FREQL;
PSTRCONbits.STRB = 1;
T2CONbits.TMR2ON = 1;
}
}
else
{
if(PWMOUT_on == 1)
{
PWMOUT_on = 0;
TMR2 = 0;
pr2num= PWM_FREQL; 这里是将PR2赋初值 停止输出就会赋
PSTRCONbits.STRB = 0;
T2CONbits.TMR2ON = 0;
}
}
详情
回复
发表于 2020-4-2 16:51
| ||
|
||
此帖出自单片机论坛
| ||
|
||
| |
个人签名刻苦学习,共同进步
|
|
| |
|
|
| |
|
|
此帖出自单片机论坛
| ||
|
||
此帖出自单片机论坛
| ||
|
||
此帖出自单片机论坛
| ||
|
||
此帖出自单片机论坛
| ||
|
||
此帖出自单片机论坛
| ||
|
||
此帖出自单片机论坛
| ||
|
||
| |
|
|
此帖出自单片机论坛
点评 | ||
|
||
此帖出自单片机论坛
| ||
|
||
此帖出自单片机论坛
| ||
|
||
EEWorld Datasheet 技术支持