- 打卡等级:以坛为家III
- 打卡总天数:657
- 最近打卡:2026-03-07 05:53:33
金牌会员
- 积分
- 1263
|
按照您的提示,我编写如下程序,期望按下不同的按键,PWM输出管脚产生不同数量的脉冲,比如电路板上电以后,按下KEY1,产生2个脉冲,按下KEY2,产生3个脉冲,按下KEY3,产生5个脉冲,现在情况是上电后,无论先按下哪个按键,它都会先产生1个脉冲,再次按下该按键,才会产生期望的脉冲数,脉冲的产生总有一个滞后,比如上电后,按下KEY2键,PWM输出管脚产生1个脉冲,再次按下KEY2,PWM输出管脚才产生期望的3个脉冲,此后如果不停的按下KEY2键,它会不停的每次产生3个脉冲,此后如果按下KEY3键,它仍然会产生3个脉冲,再次按下KEY3键,它才会产生期望的5个脉冲,此时,按下KEY1键,它会先产生5个脉冲,再次按下KEY1键,才会产生期望的2个脉冲,依次类推,请问是哪里设置的不对,程序的主要部分如下,谢谢。
void UpdatePwm(void) //设置周期时间,执行在主程序开始后,主循环之前
{ PWMA_ARRH = (u8)(Period >> 8);
PWMA_ARRL = (u8)Period;
PWMA_CCR1H = (u8)((Period >> 1) >> 8); //设置占空比时间: Period/2
PWMA_CCR1L = (u8)((Period >> 1));
}
void PwmInit(void) //PWM初始化 执行在 UpdatePwm之后
{
PWMA_ENO = 0x00; //输出使能寄存器
PWMA_ENO |= ENO1P; //使能输出
PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCMR1 = 0x68; //设置 PWM1 模式 1 输出,开启 PWMn_CCR1 寄存器的预装载功能
PWMA_CCER1 = 0x01; //使能 CC1E 通道, 高电平有效
PWMA_CCER1 = 0x03; //使能 CC1E 通道, 低电平有效
PWMA_PS = 0x00; //高级 PWM 通道输出脚选择位
PWMA_PS |= PWM1_1; //选择 PWM1_1 通道 P2.0
PWMA_BKR = 0x80; //使能主输出
PWMA_CR1 |= 0x89; //使能 ARR 预装载,单脉冲模式,开始计时
}
/************* 发送脉冲函数 **************/
void TTxPulse(u8 rep) //在主程序中执行
{ if (rep == 0) return;
rep -= 1;
PWMA_RCR = rep; //重复计数寄存器,计数 rep 个脉冲后产生更新事件
PWMA_CR1 = 0x89; //使能 ARR 预装载,单脉冲模式,开始计时
}
while (1) //主程序的主循环 ,按键均经过去抖动处理。
{
if(KEY1) //按键按下标志,按下后为1
{ KEY1=0;
TTxPulse(2); //输出 2 个脉冲
}
if(KEY2) //按键按下标志,按下后为1
{ KEY2=0;
TTxPulse(3); //输出3 个脉冲
}
if(KEY3) //按键按下标志,按下后为1
{ KEY3=0;
TTxPulse(5); //输出 5 个脉冲
}
}
|
|