chenczy 发表于 2024-7-4 13:47:53

STC12H1K16PWM 没输出输出的问题 | 梁工给了正确的程序

代码如下,我的P3.5脚 没PWM输出的,好奇怪。不知道是那里没设置对,来个大神指导下啊。
芯片用的是STC12H1K16,内部晶振11.0592MHz.
芯片电路没有外接任何元器件,只测芯片脚位的信号。
void pwm_init()
{
      
          CCON = 0x00;                         //
    CL = 0;                                 //PCA计数器 低8位
    CH = 0;                                  //PCA计数器 高8位
    CMOD = 0x00;                     //选择时钟源为系统时钟源的1/12

    CCAPM0 = 0x42;                   //0100 0010允许比较器,允许PWM0引脚输出
          //PCA_PWM0=0x00;                   //8位PWM
          PCA_PWM0=0x40;                   //7位PWM
          CCAP0H = CCAP0L = 0x00;         //设置占空比为 0
          PWMA_PS = 0xff;
          PWMB_PS = 0xf3;//P3.5输出PWM
      
    CR = 1;                        //启动 PCA 计数器阵列
      
}

main()
{
         uchar key1up=0,key2up=0,gear1=0,gear2=0;
      
      P1M0=0x00;//设置P1为准双向口
      P1M1=0x00;
      
      P3M0=0x00;//设置P3为准双向口
      P3M1=0x00;
      
      P1=0xff;
      P3=0xff;
      
      pwm_init();
      

      //PCA_PWM0=0x02;CCAP0H= CCAP0L=0xFF;   //固定输出低
      //PCA_PWM0=0x00;CCAP0H= CCAP0L=0x00;   //固定输出高

          CR = 0;
                CCAP0L=0x20;//PWM占空比(80H-20H)/80H(75%)//7位PWM
          CCAP0H=0x20;
                CR = 1;

    P34=0;
      
      while(1)
{
                delay(4000);
                P34 = ~P34;
      }

_奶咖君_ 发表于 2024-7-4 14:08:35

你这里配置的PCA0 为什么最后配置PWM输出...

寄存器用混了吧

chenczy 发表于 2024-7-4 14:50:24

不是用PCA比较器的吗?我看文档上的例程是这样的。

_奶咖君_ 发表于 2024-7-4 15:11:30

没错啊,,但是你用的是PCA的PCA0啊 你测不是PCA1么

chenczy 发表于 2024-7-4 15:34:53

不是啊,我一直用的是PCA0啊,只不过是输出是从P3.5口输出啊,难道从P3.5口输出要设成PCA1的?

_奶咖君_ 发表于 2024-7-4 15:43:13

......不是兄弟你看手册了么?
我这溜了一遍手册也没见这个片子的PCA切换引脚的寄存器啊...

梁工 发表于 2024-7-4 15:43:20

chenczy 发表于 2024-7-4 15:34
不是啊,我一直用的是PCA0啊,只不过是输出是从P3.5口输出啊,难道从P3.5口输出要设成PCA1的? ...
你的程序有问题,P3.5是PCA1,并且还操作无关的 PWMA_PS、 PWMB_PS。

我写了测试程序给你:

/*************      功能说明      **************
请先别修改程序, 直接下载"01-PCA-4路PWM-C语言"里的"PCA.hex"测试.


4路PCA都配置成10位PWM的应用.

本例 PWM0(CCP0)-->P3.7, PWM1(CCP1)-->P3.5, PWM2(CCP2)-->P2.0, PWM3(CCP3)-->P2.4, 用户可以自行修改切换到其它端口.
PWM0、PWM1、PWM2输出呼吸灯效果,PWM3间歇输出。
******************************************/





chenczy 发表于 2024-7-6 09:22:44

本帖最后由 chenczy 于 2024-7-6 09:25 编辑

梁工 发表于 2024-7-4 15:43
你的程序有问题,P3.5是PCA1,并且还操作无关的 PWMA_PS、 PWMB_PS。

我写了测试程序给你:

我下了你的程序,自己也编了,下到芯片是可以的,但是我把你的代码移到我的项目里,下到芯片就不行,搞不懂。

这是你的程序


/******************** 主函数 **************************/
void main(void)
{

        PCA_config(4, 3);        //clk=4: 选择时钟1T, 3: 10位PWM
        P3n_push_pull(Pin7+Pin5);        // P3.7 P3.5设置为推挽输出
        P2n_push_pull(Pin4+Pin0);        // P2.4 P2.0设置为推挽输出

        pwm = 128;
        B_PWM_Dir = 0;
UpdatePwm(PCA0,768);                //输出占空比3/4的PWM, 时间为2ms.
       
        while (1)
        {
                ;//delay_ms(2);
               
               
   /*
                if(B_PWM_Dir)
                {
                        if(--pwm <= 8)                B_PWM_Dir = 0;
                }
                else
                {
                        if(++pwm >= 1016)        B_PWM_Dir = 1;
                }
                UpdatePwm(PCA0, pwm);        //更新PWM.
                UpdatePwm(PCA1, pwm);        //更新PWM.
                UpdatePwm(PCA2, pwm);        //更新PWM.


                if(++cnt >= 4)                //8ms一个周期, 演示如何关闭 开启PWM.
                {
                        cnt = 0;
                        UpdatePwm(PCA3, 256);        //输出占空比1/4的PWM, 时间为2ms.
                }
                else if(cnt == 1)        PwmOutContinue(PCA3, 0);        //连续输出低电平0, 时间为2ms.
                else if(cnt == 2)        UpdatePwm(PCA3,768);                //输出占空比3/4的PWM, 时间为2ms.
                else if(cnt == 3)        PwmOutContinue(PCA3, 1);        //连续输出高电平1, 时间为2ms.
                */
        }
}


这是我的程序

void main(void)
{
       uchar key1up=0,key2up=0,gear1=0,gear2=0;
       
       
                PCA_config(4, 3);
        P3n_push_pull(Pin7+Pin5);        // P3.7 P3.5设置为推挽输出

    P34=0;
        //UpdatePwm(0,768);                //输出占空比3/4的PWM.
        PCA_PWM0 = (PCA_PWM0 & ~0x32) | (u8)((768 >> 4) & 0x30);
                CCAP0H = 768;
       
        while(1)
{
                delay(2000);
                P34 = ~P34;
               
        }
       

梁工 发表于 2024-7-6 14:07:13

chenczy 发表于 2024-7-6 09:22
我下了你的程序,自己也编了,下到芯片是可以的,但是我把你的代码移到我的项目里,下到芯片就不行,搞不 ...

你应该先使用UpdatePwm(0,768);试试。你改到出现错误了。

chenczy 发表于 2024-7-6 15:24:30

嗯,问题找到了 PCA_PWM0 = (PCA_PWM0 & ~0x32) | (u8)((768 >> 4) & 0x30);这时的设置的数据有问题,按你的这个设就好了
页: [1]
查看完整版本: STC12H1K16PWM 没输出输出的问题 | 梁工给了正确的程序