耀子 发表于 2025-2-8 10:25:29

高级PWM的点空比如果用变量代替,延迟时间长怎么解决?

老师们,新年好,,高级PWM的占空比,我用一个按键产生的变量代替,但是当按键按下时,PWM波变换延迟大约有2秒的时间。。。。请老师们看看下面代码,哪个地方出问题了,谢谢了

正常应该是按下按键后,PWM波应该马上变换,但是现在延时大约有2秒。。
591

#include "STC32G.h"
#include "intrins.h"
#include "STC32G_Delay.h"


#define MAIN_Fosc 24000000L   //定义主时钟
#define PWMA_PSCR 0         //设置分频 (分频数 = PSCR + 1)
#define PWMA_ARR 2399      //自动重装最高数

typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;

void PWMA_Init(void);

u16 PWMA_CCR;

void main(void)
{
    u8 qianjin = 0;
   
    P_SW2 |= 0x80;   //扩展寄存器(XFR)访问使能

    P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
      
      
   
      PWMA_CCR = 0;
      PWMA_Init();
   
      while(1)
      {
               
                if(P51 == 0)
                {
                        delay_ms(10);
                        if(P51 == 0)
                        {
                              delay_ms(500);
                              while(!P51);
                if(qianjin == 0)
                {
                  qianjin = 1;
                  PWMA_CCR = t;
                  PWMA_CCR1H = (u8)(PWMA_CCR >> 8);//计数比较寄存器高位,设置占空比
                  PWMA_CCR1L = (u8)(PWMA_CCR);
                  
                }
                else if(qianjin == 1)
                {
                  qianjin = 0;
                  PWMA_CCR = 0;
                  PWMA_CCR1H = (u8)(PWMA_CCR >> 8);//计数比较寄存器高位,设置占空比
                  PWMA_CCR1L = (u8)(PWMA_CCR);
                }
            }
      }
         
      }
}


void PWMA_Init(void)//PWMA的初始化
{

      
      //1.时钟源选择
      
      //2.时基单元选择
      
      PWMA_PSCRH = (u8)(PWMA_PSCR >> 8);//预分步寄存器高8位,设置1分频
      PWMA_PSCRL = (u8)(PWMA_PSCR);//预分步寄存器低8位,设置1分频
      
   
      PWMA_ARRH = (u8)(PWMA_ARR >> 8);//自动重载寄存器高8位
      PWMA_ARRL = (u8)(PWMA_ARR);   //自动重载寄存器低8位
      
      PWMA_CCR1H = (u8)(PWMA_CCR >> 8);//计数比较寄存器高位,设置占空比
      PWMA_CCR1L = (u8)(PWMA_CCR);   //计数比较寄存器低位,设置占空比
      
      //3.输入输出引脚配置
      PWMA_ENO = 0X00;       //清空使能输出引脚
      PWMA_ENO |= 0X01;      //设置使能输出PWM1P端口
//      PWMA_ENO |= 0X02;
      
   
      PWMA_PS = 0X00;      //先清空引脚配置
      PWMA_PS |= 0X01;       //选择PWM输出IO口为P20
      
   
      //4.输入输出模式配置
      PWMA_CCER1 = 0X00;   //先清零捕获比较寄存器
      PWMA_CCMR1 = 0X68;   //配置捕获比较寄存器1
      PWMA_CCER1 = 0X01;   //开启PWM通道模式为不互补,高电平有效

      //5.下面两个主功能。放在最后
      PWMA_BKR = 0X80;       //配置刹车寄存器,使用主输出
      
      PWMA_CR1 |= 0X01;               //启动计数器
      
}














耀子 发表于 2025-2-8 15:06:07

已经解决,用了按键状态机就可以了
页: [1]
查看完整版本: 高级PWM的点空比如果用变量代替,延迟时间长怎么解决?