找回密码
 立即注册
查看: 1557|回复: 12

如何让PWM输出0 | 见 数据手册

[复制链接]

该用户从未签到

551

主题

9284

回帖

1万

积分

管理员

积分
14050
发表于 2022-12-8 09:46:58 | 显示全部楼层 |阅读模式
有研发问: 怎么让 PWM 输出 0
===我找了下芯片手册
怎么让PWM输出0-1.png

怎么让PWM输出0-2.png


回复 送花

使用道具 举报

该用户从未签到

551

主题

9284

回帖

1万

积分

管理员

积分
14050
 楼主| 发表于 2022-12-8 09:55:53 | 显示全部楼层
不知从数据手册中找到的内容是否能回答上述用户问题,要等梁工,陈工,他们确认,我已不是研发多年

该用户从未签到

46

主题

2930

回帖

6603

积分

超级版主

积分
6603
发表于 2022-12-8 13:46:44 | 显示全部楼层
PCA-PWM连续输出0或1的方法,以PCA0(PWM0-CCP0)为例:
PCA_PWM0 &= ~0x02;        // PWM0正常输出
PCA_PWM0 |= 0x3f, CCAP0H = 0xff, CCAP0L = 0xff;        // PWM0一直输出0
PCA_PWM0 &= 0xc0, CCAP0H = 0,    CCAP0L = 0;        // PWM0一直输出1
===========================================

STC8A8K64D4的8路15位增强型PWM,连续输出0或1有3种方法(以PWM0--P1.0为例):

1、禁止输出PWM,对应IO成为普通IO,禁止PWM输出后,由这个IO直接输出高或低电平。
  PWM0CR |= 0x80;   // ENO=1:允许PWM输出
  delay_ms(5);      // PWM输出5ms
  P10 = 1;          // 连续输出高电平
  PWM0CR &= ~0x80;  // ENO=0:禁止PWM输出
  delay_ms(5);      // P1.0输出高电平5ms
               
  PWM0CR |= 0x80;   // ENO=1:允许PWM输出
  delay_ms(5);      // PWM输出5ms
  P10 = 0;          // 连续输出低电平
  PWM0CR &= ~0x80;  // ENO=0:禁止PWM输出
  delay_ms(5);      // P1.0输出低电平5ms

2、PWM0T2设置输出高电平时刻,PWM0T1设置输出低电平时刻,PWM0T1-PWM0T2就是输出高电平时间。
   如果将PWM0T1设置的数值比周期值大,则连续输出高电平,输出100%占空比。
   如果将PWM0T2设置的数值比周期值大,则连续输出低电平,输出0%占空比。

3、使用“PWM通道电平保持控制寄存器 PWMnHLD”直接设置输出高或低,
   这个寄存器就是专门用于设置连续输出高或低的。
   PWM0HLD = 0x00;  //PWM正常输出
   PWM0HLD = 0x01;  //PWM输出连续低电平
   PWM0HLD = 0x02;  //PWM输出连续高电平
===========================================

STC8G2K64S4的45路15位增强型PWM,连续输出0或1有3种方法(以PWM00为例):

1、禁止输出PWM,对应IO成为普通IO,禁止PWM输出后,由这个IO直接输出高或低电平。
  PWM00CR |= 0x80;   // ENO=1:允许PWM输出
  delay_ms(5);       // PWM输出5ms
  P00 = 1;           // 连续输出高电平
  PWM00CR &= ~0x80;  // ENO=0:禁止PWM输出
  delay_ms(5);       // P0.0输出高电平5ms
               
  PWM00CR |= 0x80;   // ENO=1:允许PWM输出
  delay_ms(5);       // PWM输出5ms
  P00 = 0;           // 连续输出低电平
  PWM00CR &= ~0x80;  // ENO=0:禁止PWM输出
  delay_ms(5);       // P0.0输出低电平5ms

2、PWM00T2设置输出高电平时刻,PWM00T1设置输出低电平时刻,PWM00T1-PWM00T2就是输出高电平时间。
   如果将PWM00T1设置的数值比周期值大,则连续输出高电平,输出100%占空比。
   如果将PWM00T2设置的数值比周期值大,则连续输出低电平,输出0%占空比。

3、使用“PWM通道电平保持控制寄存器 PWMnHLD”直接设置输出高或低,
   这个寄存器就是专门用于设置连续输出高或低的。
   PWM00HLD = 0x00;  //PWM正常输出
   PWM00HLD = 0x01;  //PWM输出连续低电平
   PWM00HLD = 0x02;  //PWM输出连续高电平
===========================================

STC8H系列的高级PWM,连续输出0或1有2种方法(以PWM1P为例):

1、使用PWMx_ENO禁止输出PWM,对应IO成为普通IO,禁止PWM输出后,由这个IO直接输出高或低电平。
  PWMA_ENO |= 0x01;   // 允许PWM1P输出
  delay_ms(5);        // P1.0输出PWM 5ms
  P10 = 1;            // P1.0输出高电平
  PWMA_ENO &= ~0x01;  // 关闭PWM输出
  delay_ms(5);        // P1.0输出高电平5ms
               
  PWMA_ENO |= 0x01;   // 允许PWM1P输出
  delay_ms(5);        // P1.0输出PWM 5ms
  P10 = 0;            // P1.0输出低电平
  PWMA_ENO &= ~0x01;  // 关闭PWM输出
  delay_ms(5);        // P1.0输出高电平5ms

2、设置PWMx_CCMRn,强制PWM输出有效(高)电平/无效(低)电平。
  PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;  // PWM正常输出
  delay_ms(5);                               // PWM输出5ms
  PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x40;  // 强制PWM输出无效(低)电平
  delay_ms(5);                               // PWM输出低电平5ms
  PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;  // PWM正常输出
  delay_ms(5);                               // PWM输出5ms
  PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x50;  //强制PWM输出有效(高)电平
  delay_ms(5);                               // PWM输出高电平5ms

  • TA的每日心情
    开心
    2024-4-12 20:06
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    4

    主题

    11

    回帖

    176

    积分

    注册会员

    积分
    176
    发表于 2023-2-11 20:58:56 | 显示全部楼层
    梁工 发表于 2022-12-8 13:46
    PCA-PWM连续输出0或1的方法,以PCA0(PWM0-CCP0)为例:
    PCA_PWM0 &= ~0x02;        // PWM0正常输出
    PCA_PWM0 |= 0x ...

    STC32 如何处理呢

    该用户从未签到

    551

    主题

    9284

    回帖

    1万

    积分

    管理员

    积分
    14050
     楼主| 发表于 2023-2-11 21:22:08 | 显示全部楼层
    1.png

    该用户从未签到

    551

    主题

    9284

    回帖

    1万

    积分

    管理员

    积分
    14050
     楼主| 发表于 2023-2-11 21:24:55 | 显示全部楼层
    STC32的PWM 同 STC8H的PWM

    该用户从未签到

    46

    主题

    2930

    回帖

    6603

    积分

    超级版主

    积分
    6603
    发表于 2023-2-12 10:54:45 | 显示全部楼层
    对的,STC32G的PWM处理方式与上面“STC8H系列的高级PWM,连续输出0或1有2种方法”的一样。

    该用户从未签到

    14

    主题

    33

    回帖

    202

    积分

    中级会员

    积分
    202
    发表于 2024-3-10 20:51:03 | 显示全部楼层
    本帖最后由 alanma 于 2024-3-10 21:03 编辑
    梁工 发表于 2022-12-8 13:46
    PCA-PWM连续输出0或1的方法,以PCA0(PWM0-CCP0)为例:
    PCA_PWM0 &= ~0x02;        // PWM0正常输出
    PCA_PWM0 |= 0x ...

    我也遇到同样的问题,可否帮看下代码地方有问题?
    ;******************************************/

    $include (/STC8H.INC)

    ;====================
    STACK_POIRTER   EQU     0D0H    ;堆栈开始地址

    ;*************  本地变量声明    **************/
    PWM1_Flag       BIT     20H.0
    PWM1_Duty_H     DATA    30H
    PWM1_Duty_L     DATA    31H
    INT_TIME BIT 20H.1

    ;*******************************************************************
    ;*******************************************************************
            ORG     0000H               ;reset
            LJMP    F_Main

            ORG     000BH               ;1  Timer0 interrupt
            LJMP    F_Timer0_Interrupt

    ;******************** 主程序 **************************/
            ORG     0100H       ;reset
    F_Main:
        ORL     P_SW2, #080H    ;扩展寄存器(XFR)访问使能

        MOV     P0M0,#07H                   ;设置P0.3为高阻输入,P0.0-0.2为推挽输出
        MOV     P0M1,#08H
        MOV     P1M0,#01H                  ;设置P1.0为推挽输出模式,P1.1,P1.3,P1.4,P1.6,P1.7为高阻输入
        MOV     P1M1,#0DAH
        MOV     P2M0,#07H                   ;设置P2.0~P2.2为推挽输出
        MOV     P2M1,#00H
        MOV     P3M0,#08H                  ;设置P3
        MOV     P3M1,#00H
        MOV     P4M0,#00H                  
        MOV     P4M1,#00H
            MOV     P5M0,#10H                  ;设置P5.4为推挽输出
        MOV     P5M1,#00H
        MOV     SP, #STACK_POIRTER
        MOV     PSW, #0
        USING   0       ;选择第0组R0~R7
       
        MOV     SP, #STACK_POIRTER
        MOV     PSW, #0
        USING   0       ;选择第0组R0~R7
                            
            CLR P3.6  ;测试用

    ;================= 用户初始化程序 ====================================
        CLR     PWM1_Flag

        MOV     PWM1_Duty_L, #0
        MOV     PWM1_Duty_H, #0

        CLR     TR0

            MOV TMOD,#00000001B       ;置T1为方式1,16位自动重载定时方式,置T0为方式1,16为不自动重载定时方式,           
           MOV TL1,#0C0H               ;T1定时20ms
            MOV TH1,#063H
            MOV TL0,#0E0H              ;定时10mS常数
          MOV TH0,#0B1H
            SETB ET0                                                                        
                    SETB TR0
            SETB EA                   ;开中断
            
        LCALL   F_PWM_Init          ; PWM初始化

    ;=================== 主循环 ==================================
    L_Main_Loop:

        LJMP    L_Main_Loop

    ;========================================================================
    ; 函数: F_PWM_Init
    ; 描述: PWM初始化程序.
    ; 参数: none
    ; 返回: none.
    ; 版本: V1.0, 2021-3-3
    ;========================================================================
    F_PWM_Init:
        CLR     A                   ;写 CCMRx 前必须先清零 CCxE 关闭通道
        MOV     DPTR,#PWMA_CCER1
        MOVX    @DPTR,A

            
        MOV     A,#068H             ;设置 PWMx 模式1 输出
        MOV     DPTR,#PWMA_CCMR1
        MOVX    @DPTR,A

            
        MOV     A,#03H             ;配置通道输出使能和极性
        MOV     DPTR,#PWMA_CCER1
        MOVX    @DPTR,A

        MOV     A,#3                ;设置周期时间
        MOV     DPTR,#PWMA_ARRH
        MOVX    @DPTR,A
        MOV     A,#0FFH
        MOV     DPTR,#PWMA_ARRL
        MOVX    @DPTR,A

        MOV     A,#01H             ;使能 PWM1P 输出
        MOV     DPTR,#PWMA_ENO
        MOVX    @DPTR,A
       
        MOV     A,#01H              ;高级 PWM 通道输出脚选择位, P2.0为01H,P1.0为00H
        MOV     DPTR,#PWMA_PS
        MOVX    @DPTR,A
      
         MOV     A,#080H             ;使能主输出
        MOV     DPTR,#PWMA_BKR
        MOVX    @DPTR,A

        MOV     DPTR,#PWMA_CR1
        MOVX    A,@DPTR
        ORL     A,#01H              ;开始计时
        MOVX    @DPTR,A        
       
        RET

    ;========================================================================
    ; 函数: F_UpdatePwm
    ; 描述: 更新PWM占空比值.
    ; 参数: [PWMn_Duty_H PWMn_Duty_L]: pwm占空比值.
    ; 返回: none.
    ; 版本: V1.0, 2021-3-3
    ;========================================================================
    F_UpdatePwm:
        MOV     A, PWM1_Duty_H      ;设置占空比时间
        MOV     DPTR, #PWMA_CCR1H
        MOVX    @DPTR, A
        MOV     A, PWM1_Duty_L
        MOV     DPTR, #PWMA_CCR1L
        MOVX    @DPTR, A

        RET

    ;**************** 中断函数 ***************************************************
    F_Timer0_Interrupt: ;Timer0 1ms中断函数
        PUSH    PSW     ;PSW入栈
        PUSH    ACC     ;ACC入栈
       
            CLR TR0
        MOV      TL0,#00H      ;T0定时10毫秒
        MOV      TH0,#00H
            
            CPL INT_TIME
            MOV C,INT_TIME
            JC  F_INT2
            
        MOV     A,#0H             ;关闭PWM输出
        MOV     DPTR,#PWMA_ENO
        MOVX    @DPTR,A            
            NOP
            NOP
            CLR P2.0                  ;输出脚拉低        
            
        JMP INT_END
            
            
    F_INT2:
            
            MOV     A,#01H             ;使能 PWM1P 输出
        MOV     DPTR,#PWMA_ENO
        MOVX    @DPTR,A
        JMP INT_END

    F_QuitTimer0:
        LCALL   F_UpdatePwm
            INT_END:
            SETB TR0
        POP     ACC     ;ACC出栈
        POP     PSW     ;PSW出栈
        RETI


    ;======================================================================

        END

    点评

    你先详细说一下你遇到的问题。 另外,郑旭中没看到标号 INT_END。  详情 回复 发表于 2024-3-11 10:38
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9284

    回帖

    1万

    积分

    管理员

    积分
    14050
     楼主| 发表于 2024-3-10 21:20:31 | 显示全部楼层
    截图202403102120275456.jpg
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9284

    回帖

    1万

    积分

    管理员

    积分
    14050
     楼主| 发表于 2024-3-10 21:22:05 | 显示全部楼层
    截图202403102121043568.jpg


    截图202403102121379927.jpg

    截图202403102122039387.jpg

    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-2 10:23 , Processed in 0.070165 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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