Honsiti 发表于 2023-11-22 15:22:52

求助帖



根据官方例程修改了输出引脚——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;
    }
}

神农鼎 发表于 2023-11-22 18:03:45

你描述下,要实现啥功能,看大家如有现成的程序,直接发上来给你参考

Honsiti 发表于 2023-11-23 08:30:12

我最终想要实现的是输出两路 相位差180的 频率 占空比可调节的pwm 。由于第一次用STC所以只能先从输出两路pwm做起

Honsiti 发表于 2023-11-23 09:01:24

神农鼎 发表于 2023-11-22 18:03
你描述下,要实现啥功能,看大家如有现成的程序,直接发上来给你参考

还有一点我不太懂,比如 pwm比较输出模式下频率=时钟/(ARR*PSC)改变频率就设置ARR 和 PSC 的值,但是这个时钟是要自己配置还是系统配置文件中已经配置好了,只需要用户自己配置 ARR 和 PSC即可。

gentleman 发表于 2023-11-23 11:50:45

Honsiti 发表于 2023-11-23 09:01
还有一点我不太懂,比如 pwm比较输出模式下频率=时钟/(ARR*PSC)改变频率就设置ARR 和 PSC 的值,但是 ...

默认系统时钟   通过PSC 设置分频
页: [1]
查看完整版本: 求助帖