找回密码
 立即注册
查看: 170|回复: 1

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

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:90
  • 最近打卡:2025-04-12 15:58:13

24

主题

70

回帖

644

积分

高级会员

积分
644
发表于 2025-2-8 10:25:29 | 显示全部楼层 |阅读模式
老师们,新年好,,高级PWM的占空比,我用一个按键产生的变量代替,但是当按键按下时,PWM波变换延迟大约有2秒的时间。。。。请老师们看看下面代码,哪个地方出问题了,谢谢了

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


#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;               //启动计数器
        
}














回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:90
  • 最近打卡:2025-04-12 15:58:13

24

主题

70

回帖

644

积分

高级会员

积分
644
发表于 2025-2-8 15:06:07 | 显示全部楼层
已经解决,用了按键状态机就可以了
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 11:16 , Processed in 0.727302 second(s), 52 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表