lizye 发表于 2022-2-3 21:59

PIC单片机输出频率可变的PWM波形

采用了TMR2定时器的PWM输出,功能要求就是正占空比是100uS,然后频率可调节,从1k到3k的频率调节,然后我采用的是通过定时器1进行10ms的定时,在中断服务函数中进行处理,直接将PR2的值进行改变来实现频率的调节,在主函数中 通过操作 PSTRCONbits.STRB = 1;T2CONbits.TMR2ON = 1; 来开启PWM输出 ,通过 PSTRCONbits.STRB = 0;T2CONbits.TMR2ON = 0;来关闭PWM输出。

heweibig 发表于 2022-2-3 22:02


还有什么现象?能再详细描述下吗?

lizye 发表于 2022-2-3 22:04

就是在输出PWM波形的时候会出现有1.3ms的持续低电平没有输出

lizye 发表于 2022-2-3 22:06

我在主函数中进行开启和关闭PWM输出,当关闭PWM输出时,我又将PR2赋值为初值,可是再次开启PWM的时候却是在刚才关闭时的频率的那个值继续处理,而不是从初值那个时候产生其PWM。

dengdc 发表于 2022-2-3 22:10


楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

lizye 发表于 2022-2-3 22:12

//
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.5kHZ3521hz高频率的赋值

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;
             PR2 = PWM_FREQL;
             PSTRCONbits.STRB = 1;
             T2CONbits.TMR2ON = 1;
          }
      }
      else
      {
          if(PWMOUT_on   == 1)
          {   
            PWMOUT_on= 0;
            TMR2 = 0;
            PR2 = PWM_FREQL;       这里是将PR2赋初值 停止输出就会赋
            PSTRCONbits.STRB = 0;
            T2CONbits.TMR2ON = 0;
          }
      }

lizye 发表于 2022-2-3 22:14


lizye 发表于 2022-2-3 22:17


lizye 发表于 2022-2-3 22:20


zhanghqi 发表于 2022-2-3 22:22

在主函数里面赋初值不应该是直接赋给PR2

zhanghqi 发表于 2022-2-3 22:24

应该赋给 pr2num

lizye 发表于 2022-2-3 22:26

因为一直没有改过pr2m 所以 就只是 操作了一次PR2

zwll 发表于 2022-2-3 22:28

在主程序里有禁止/使能PWM输出的操作,那么在禁止PWM输出期间没有PWM输出不是很正常吗?

llljh 发表于 2022-2-3 22:31

修改PR2寄存器,无需关闭PWM或禁止PWM输出

huangchui 发表于 2022-2-3 22:32

只要PR2值变了,周期肯定会变。

yszong 发表于 2022-2-3 22:35

你可以改的变化幅度大一点,看你的TMR1中断里都是以1为步长在修改PR2

lizye 发表于 2022-2-3 22:43

我在主函数禁止/使能PWM输出的操作是需要操作外围电路才会让其输出或者不输出 ,这个断续的现象是出现在一直使能输出的时候   修改PR2是我使能输出了 ,然后定时器10MS进一次 修改PR2的值 然后在输出这个PWM时偶尔会出现的这个断续 1.3ms左右

supernan 发表于 2022-2-3 22:45

建议你可以先把程序中的判断控制部分去掉,看看PWM输出还有没有这种断续。

huangchui 发表于 2022-2-3 22:47

把关TMR2的代码都先屏蔽掉看看

lizye 发表于 2022-2-3 22:49

我现在主程序一直输出PWM 还是会出现这个问题
页: [1] 2 3
查看完整版本: PIC单片机输出频率可变的PWM波形