找回密码
 立即注册
查看: 525|回复: 9

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-07-04 13:37:37

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2024-7-4 13:47:53 | 显示全部楼层 |阅读模式
代码如下,我的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;
        }
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-7-4 14:08:35 | 显示全部楼层
你这里配置的PCA0 为什么最后配置PWM输出...

寄存器用混了吧
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-07-04 13:37:37

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2024-7-4 14:50:24 | 显示全部楼层
不是用PCA比较器的吗?我看文档上的例程是这样的。

截图202407041450219721.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-7-4 15:11:30 | 显示全部楼层
没错啊,,但是你用的是PCA的PCA0啊 你测不是PCA1么
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-07-04 13:37:37

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2024-7-4 15:34:53 | 显示全部楼层
不是啊,我一直用的是PCA0啊,只不过是输出是从P3.5口输出啊,难道从P3.5口输出要设成PCA1的?

点评

你的程序欧问题,P3.5是PCA1,并且还操作无关的 PWMA_PS、 PWMB_PS。 我写了测试程序给你: /************* 功能说明 ************** 请先别修改程序, 直接下载"01-PCA-4路PWM-C语言"里的"PCA.hex"测试. 4路PCA  详情 回复 发表于 2024-7-4 15:43
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-7-4 15:43:13 | 显示全部楼层
......不是兄弟你看手册了么?
我这溜了一遍手册也没见这个片子的PCA切换引脚的寄存器啊...
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2024-7-4 15:43:20 | 显示全部楼层
chen*** 发表于 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间歇输出。
******************************************/



STC12H系列-PCA相关程序.rar (45.8 KB, 下载次数: 64)

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-07-04 13:37:37

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 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;
               
        }
       

点评

你应该先使用UpdatePwm(0,768); 试试。你改到出现错误了。  详情 回复 发表于 2024-7-6 14:07
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2024-7-6 14:07:13 | 显示全部楼层
chen*** 发表于 2024-7-6 09:22
我下了你的程序,自己也编了,下到芯片是可以的,但是我把你的代码移到我的项目里,下到芯片就不行,搞不 ...

你应该先使用UpdatePwm(0,768);  试试。你改到出现错误了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-07-04 13:37:37

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2024-7-6 15:24:30 | 显示全部楼层
嗯,问题找到了 PCA_PWM0 = (PCA_PWM0 & ~0x32) | (u8)((768 >> 4) & 0x30);这时的设置的数据有问题,按你的这个设就好了
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 00:41 , Processed in 0.142302 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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