求助帖
根据官方例程修改了输出引脚——P10 P11 但是烧录后无法正常输出,因此疑惑是什么地方配置错误
#define FOSC 12000000UL
#define PWM_PSC (120-1) //定义PWM时钟预分频系数
#define PWM_PERIOD2000 //定义PWM周期值
//(频率=FOSC/(PWM_PSC+1)/PWM_PERIOD=50Hz)
#define PWM_DUTY 50 //定义PWM的占空比值
//(占空比=PWM_DUTY/PWM_PERIOD*100%=25%)
void PWM_Init()
{
PWMA_PSCR = PWM_PSC; //配置预分频系数
PWMA_CCER1 = 0x00; //写CCMRx前必须先清零CCxE关闭通道
PWMA_CCER2 = 0x00;
PWMA_CCMR1 = 0x60; //通道模式配置PWM模式1
PWMA_CCMR2 = 0x30; //通道模式配置输出比较模式
PWMA_CCMR3 = 0x30; //通道模式配置输出比较模式
PWMA_CCER1 = 0x55; //配置通道1,2,3输出使能和极性
PWMA_CCER2 = 0x05;
PWMA_ARR = PWM_PERIOD; //设置周期时间
PWMA_ENO = 0x3f; //使能PWM输出
PWMA_PS = 0x00; //高级PWM通道输出脚选择P2.0-P2.5
PWMA_CCR1 = PWM_DUTY; //设置占空比时间
PWMA_CCR2 = PWM_PERIOD/3; //设置OC2起始翻转位
PWMA_CCR3 = PWM_PERIOD/3*2; //设置OC3起始翻转位
PWMA_IER = 0x0d; //使能OC2/OC3比较中断,更新中断
PWMA_BRK = 0x80; //使能主输出
PWMA_CR1 |= 0x01; //开始计时
}
void main()
{
Io_Init();
PWM_Init();
EA = 1; //打开总中断
while (1);
}
void PWMA_ISR() interrupt 26
{
if (PWMA_SR1 & 0x01)
{
PWMA_CCR2 = PWM_PERIOD/3; //设置占空比时间
PWMA_CCR3 = PWM_PERIOD/3*2; //设置占空比时间
PWMA_SR1 &= ~0x01;
}
else if (PWMA_SR1 & 0x04)
{
PWMA_CCR2 = (PWM_PERIOD/3+PWM_DUTY); //设置0C2结束翻转位
PWMA_SR1 &= ~0x04;
}
else if (PWMA_SR1 & 0x08)
{
PWMA_CCR3 = (PWM_PERIOD/3*2+PWM_DUTY);//设置0C3结束翻转位
PWMA_SR1 &= ~0x08;
}
else
{
PWMA_SR1 = 0;
}
}
你描述下,要实现啥功能,看大家如有现成的程序,直接发上来给你参考 我最终想要实现的是输出两路 相位差180的 频率 占空比可调节的pwm 。由于第一次用STC所以只能先从输出两路pwm做起 神农鼎 发表于 2023-11-22 18:03
你描述下,要实现啥功能,看大家如有现成的程序,直接发上来给你参考
还有一点我不太懂,比如 pwm比较输出模式下频率=时钟/(ARR*PSC)改变频率就设置ARR 和 PSC 的值,但是这个时钟是要自己配置还是系统配置文件中已经配置好了,只需要用户自己配置 ARR 和 PSC即可。 Honsiti 发表于 2023-11-23 09:01
还有一点我不太懂,比如 pwm比较输出模式下频率=时钟/(ARR*PSC)改变频率就设置ARR 和 PSC 的值,但是 ...
默认系统时钟 通过PSC 设置分频
页:
[1]