找回密码
 立即注册
查看: 1119|回复: 14

stc8h2k08u的pwm的问题请教

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-04-29 16:05:15

2

主题

8

回帖

38

积分

新手上路

积分
38
发表于 2024-4-28 22:00:14 | 显示全部楼层 |阅读模式
本帖最后由 雪山 于 2024-4-28 22:02 编辑

在p16口输出pwm波形,发现会周期性的出现占空比出现50%的情况,是实际输出占空比为60%

以下是示例代码:

#include    "stc8h.h"
#include    "intrins.h"

#define     MAIN_Fosc       24000000L

typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;

u16 Period;

void main(void)
{
    P_SW2 |= 0x80;

    P1M0 |= 0xc0;
    P1M1 &= ~0xc0;
    P1PU |= 0xc0;

    PWMA_ENO = 0x00;
    PWMA_ENO |= 0x40;    // pwm4p                    

    PWMA_CCER2 = 0x00;                        
    PWMA_CCMR4 = 0x68;                        
    PWMA_CCER2 = 0xF0;                        

    PWMA_PS = 0x00;                           
    PWMA_PS |= 0x00;     //PWM4_1                  

    PWMA_BKR = 0x80;                          
    PWMA_CR1 |= 0x11;                        
    PWMA_PSCR = 0;               
    Period = 23;
    PWMA_ARR = Period;
    PWMA_CCR4 = Period * (1-0.6);
    EA = 1;

    while (1)
    {
      
    }
}


不知道问题出在哪?
下图是逻辑分析仪获取的波形:

pwm波形

pwm波形



还有个问题就是,设置ccr4的寄存器的占空比,为什么是反过来,要60%占空比,结果出来是40%,最后只有改成 1-占空比
回复

使用道具 举报 送花

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

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-4-29 10:44:51 | 显示全部楼层
1、PWM不需要中断,没有中断函数,不要设置中断,EA = 0;
2、PWMA_CCR4 = Period * (1-0.6); 这句是用整数做浮点运算,可能会出错,一定要写成可靠、可知的方式:
     PWMA_CCR4 = (u16)((float)Period * (1-0.6));
看波形最好使用数字示波器。特别不要使用简易的逻辑分析仪。

如仍有问题,请参考下面STC官方例程。

STC8H系列-高级PWM范例程序下载,2024/1/3 更新
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1779
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-4-29 11:08:40 | 显示全部楼层
通过修改输出极性可翻转电平信号
截图202404291108189358.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-04-29 16:05:15

2

主题

8

回帖

38

积分

新手上路

积分
38
发表于 2024-4-29 16:06:23 | 显示全部楼层
梁*** 发表于 2024-4-29 10:44
1、PWM不需要中断,没有中断函数,不要设置中断,EA = 0;
2、PWMA_CCR4 = Period * (1-0.6); 这句是用整数 ...

感谢梁工的指点,我回头试下,逻辑分析应该还可以的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-04-29 16:05:15

2

主题

8

回帖

38

积分

新手上路

积分
38
发表于 2024-4-29 16:07:04 | 显示全部楼层
乘风*** 发表于 2024-4-29 11:08
通过修改输出极性可翻转电平信号

多谢指点,这样修改,是不是可以将占空比反过来了?

点评

PWM是硬件产生的,本身绝对不会出现偶尔自己改变占空比的情况。 那你用官方例子测试看看。  详情 回复 发表于 2024-4-29 16:31
回复 支持 反对

使用道具 举报 送花

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

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-4-29 16:31:54 | 显示全部楼层
雪*** 发表于 2024-4-29 16:07
多谢指点,这样修改,是不是可以将占空比反过来了?

PWM是硬件产生的,本身绝对不会出现偶尔自己改变占空比的情况。
那你用官方例子测试看看。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-04-29 16:05:15

2

主题

8

回帖

38

积分

新手上路

积分
38
发表于 2024-4-29 19:50:30 | 显示全部楼层
梁*** 发表于 2024-4-29 16:31
PWM是硬件产生的,本身绝对不会出现偶尔自己改变占空比的情况。
那你用官方例子测试看看。 ...


梁工,我用的是高级PWM相关程序\12-PWMA-4个单脉冲输出\这下面的工程,没有做任何改动,直接烧录的hex文件
下面是测试波形


确实占空比是固定49%左右,但是这个占空比感觉和程序里面的对应不上(我使用的是p16引脚作为pwm)
按照代码中的参数和公式计算出pwm频率应该是500Hz,和实测50Hz没对上,占空比还没搞明白怎么计算,按照注释理解,是1-250/2000吗?还是250/2000,感觉都和实际波形对不上
还请梁工指点迷津。

    PWMA_PSCR   = 11;   // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0]+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
    PWMA_DTR    = 0;    // 死区时间配置, n=0~127: DTR= n T,   0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,  
                        //              0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T,   0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
    PWMA_ARR    = 2000; // 自动重装载寄存器,  控制PWM周期



    PWMA_CCR4   = 1750;     // 计数器比较值, 匹配时刻. 输出单脉冲延时1750us, 宽度=2000-1750=250us.
    PWMA_CCMR4  = (7<<4)+8; // 通道1模式配置: 0: 无输出, 1:匹配时输出高, 2:匹配时输出低, 3:匹配时输出翻转, 4:固定输出低, 5:固定输出高, 6:PWM模式1(正脉冲), 7:PWM模式2(负脉冲).  +8:允许CCRn预装载, +0:禁止预装载. +4:允许输出比较快速使能, +0:禁止. +0:输出, +1:输入映射在TI1FP1,  +3:输入映射在TI2FP1,  +3:输入映射在TRC.
    PWMA_CCER2 |= 0x50;     // 开启比较输出, 高电平有效
    PWMA_PS    |= (0<<6);   // 选择IO, 0:选择P1.6 P1.7, 1:选择P2.6 P2.7, 2:选择P6.6 P6.7, 3:选择P3.3 P3.4
    PWMA_ENO   |= 0xC0;     // IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P





截图202404291943243332.jpg

点评

你用错程序了,你测的是单脉冲输出,不是PWM,你应该测试“01A-PWMA-4对互补PWM输出P1口“测试,这个才是PWM程序。  详情 回复 发表于 2024-4-29 21:48
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-04-29 16:05:15

2

主题

8

回帖

38

积分

新手上路

积分
38
发表于 2024-4-29 19:52:59 | 显示全部楼层
梁*** 发表于 2024-4-29 10:44
1、PWM不需要中断,没有中断函数,不要设置中断,EA = 0;
2、PWMA_CCR4 = Period * (1-0.6); 这句是用整数 ...

梁工,我改成1和2要求的,最后出来的波形,还是有周期性的出现占空比为50%的情况,有点没方向了

点评

直接测试我的例程看看,直接下载HEX测试,先不要修改。这是硬件PWM,没听说占空比会自己变来变去的。  详情 回复 发表于 2024-4-29 21:44
回复 支持 反对

使用道具 举报 送花

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

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-4-29 21:44:28 | 显示全部楼层
雪*** 发表于 2024-4-29 19:52
梁工,我改成1和2要求的,最后出来的波形,还是有周期性的出现占空比为50%的情况,有点没方向了 ...

直接测试我的例程看看,直接下载HEX测试,先不要修改。这是硬件PWM,没听说占空比会自己变来变去的。
回复 支持 反对

使用道具 举报 送花

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

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-4-29 21:48:02 | 显示全部楼层
雪*** 发表于 2024-4-29 19:50
梁工,我用的是高级PWM相关程序\12-PWMA-4个单脉冲输出\这下面的工程,没有做任何改动,直接烧录的hex文 ...

你用错程序了,你测的是单脉冲输出,不是PWM,你应该测试“01A-PWMA-4对互补PWM输出P1口“测试,这个才是PWM程序。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 14:43 , Processed in 0.162071 second(s), 116 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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