alanma 发表于 2024-3-20 09:50:44

PWM输出影响数码管

本帖最后由 alanma 于 2024-3-20 10:33 编辑

有没有老师指导下?SET8H4K的P1.0的PWM输出,但是每次PWM输出的时候,数码管的共阳COM2(P2.2)会闪烁点亮,已经排除硬件短路等问题,原因一直没找到,PWM配置的是单独的输出,数码管为共阳的三位数码管,即使把数码管全部设置为没有输出,PWM输出的时候,数码管仍然会有部分笔画闪烁显示;PWM和数码管配置,以及PWM输出控制代码如下,
;========================================================================
; 函数: F_PWM_Init
; 描述: PWM初始化程序.
;========================================================================
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,#2EH                ;设置PWM频率=SYSCLK/(PWMx_PSCR+1)X(PWMx_ARR+1)=2kHz (PWMx_PSCR=0
    MOV   DPTR,#PWMA_ARRH
    MOVX    @DPTR,A
    MOV   A,#0E0H
    MOV   DPTR,#PWMA_ARRL
    MOVX    @DPTR,A

    MOV   A,#00H             ;使能 PWM1P 输出;初始化不输出PWM,=01输出
    MOV   DPTR,#PWMA_ENO
    MOVX    @DPTR,A
   
    MOV   A,#00H            ;高级 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
   
MOV   PWM1_Duty_L, #0FFH   ;占空比50%
    MOV   PWM1_Duty_H, #15H    ;数值越大,占空比越大,=20占空比70%,=14占空比44%,=17占空比50%

;========================================================================
; 函数: F_UpdatePwm
; 描述: 更新PWM占空比值.
; 参数: : pwm占空比值.
;========================================================================
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

;=======================
HEAT:
    MOV A,TEMP_STATE    ;判断加热状态,1为加热,0为不加热
JZF_INT0

    CLR C
    MOV A,FLAG_TEMP
    SUBB A,#60;设定小于50度关闭输出
    JCF_INT0
    CLR C
MOV A,FLAG_TEMP
SUBB A,TEMP_NUB
JNC F_INT1

INC TEMP_DOWN_DATA    ;连续5次温度值高于设定值才关闭,补偿温度不足的问题
MOV A, TEMP_DOWN_DATA
CJNE A,#8,INT_END
MOV TEMP_DOWN_DATA ,#0H
F_INT0:
    MOV   A,#0H             ;关闭PWM输出
    MOV   DPTR,#PWMA_ENO
    MOVX    @DPTR,A            
NOP
NOP
CLR P1.0                  ;输出脚拉低         
    RET

F_INT1:

    MOV   A,#01H             ;使能 PWM1P 输出
    MOV   DPTR,#PWMA_ENO
    MOVX    @DPTR,A
INT_END:
RET


;======================================================
DSPLAY_Init:
    MOV DPTR,#P2DR   ;P2DR地址0FE2AH
MOV A,#07H
MOVX @DPTR,A          ; 设置P2.0-2.2强电流输出

MOV DPTR,#COMEN   ;
MOV A,#07H
MOVX @DPTR,A ; //允许3个CO

MOV DPTR,#SEGENL;//允许0个SEG 低字节
MOV A,#0H
MOVX @DPTR,A

MOV DPTR,#SEGENH;//允许8个SEG 高字节
MOV A,#0FFH
MOVX @DPTR,A
      
MOV DPTR,#LEDCTRL;/B7=1: ON,B5 B4: 0共阴, 1共阳, 2共阴共阳, 3保留, B2 B1 B0: 0占空比100%, 1~7占空比7/8~1/8
MOV A,#011H
MOVX @DPTR,A

MOV DPTR,#LEDCKS   //数码管COM扫描显示的主频时钟数 = 160*9*LEDCKS, 每个COM显示时间=1440*LEDCKS/fosc(MHz) us, COM扫描频率=fosc/(1440*LEDCKS *COM数).
MOV A,#08H    //例如 fosc = 11.0592MHz, 8个COM, LEDCKS = 8, 则每个COM显示时间=1440*8/11.0592 = 1042 us, COM扫描频率=11059200/(1440*8*8)=120Hz.
MOVX @DPTR,A    //已知扫描时间t(us)计算 LEDCKS = t*fosc(MHz)/1440, 比如fosc = 24MHz, 要求1个COM扫描1ms, 则 LEDCKS = 1000*24/1440 = 16.7, 取整数17.
    RET

国学芯用 发表于 2024-3-20 10:24:27

排除法,先单独测试数码管

alanma 发表于 2024-3-20 10:27:42

国学芯用 发表于 2024-3-20 10:24
排除法,先单独测试数码管

只要不开PWM,数码管都是正常显示的

李鑫发 发表于 2024-3-20 13:45:31

本帖最后由 STCAI-32位8051 于 2024-3-21 17:33 编辑

汇编太难了。。。

alanma 发表于 2024-3-21 09:35:06

补充说明下,我把数码管的所有寄存器清零后,
开启PWM输出后,仍然有笔画闪烁输出,
但是我把数码管的电源关闭掉(LEDCTRL的B7=0)后,
闪烁的数码管笔端才没有闪烁点亮,
PWM对应的管脚为P1.0,
对应的闪烁笔段的COM口为P2.2,对应的SEG口为P0.0

神农鼎 发表于 2024-3-21 10:02:38

你这还是不用 仿真器查你程序错在哪的问题 !
用 仿真器 深入进去,看你程序错在哪的手段:
单步运行,运行到光标处,运行到断点



仿真STC8,STC-USB Link1D支持STC32/STC8仿真及下载 !视频讲解 - 仿真/编译器/头文件 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)




AI-32位8051 发表于 2024-3-21 10:16:42

李鑫发 发表于 2024-3-20 13:45
汇编太难了。。。

北京化工大学,何宾教授亲自主讲,STC创始人主持授课,正统权威。从第24集到第30集专业讲解:汇编语言程序设计,可以跟着视频一起学习{:handshake:}



【新提醒】视频教学:《STC32位8051单片机原理及应用》,何宾教授主讲 - 视频教学,《单片机原理及应用》教学改革及实践研讨会,实战技术交流会,会务通知 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3355&extra=page%3D1

乘风飞扬 发表于 2024-3-21 10:43:40

附件提供一份数码管显示同时PWMA端口输出PWM脉冲例子,这两个功能不会相互干扰。



演示效果:


参考程序:

嵌入式之路 发表于 2024-3-21 11:18:34

STCAI-32位8051 发表于 2024-3-21 10:16
北京化工大学,何宾教授亲自主讲,STC创始人主持授课,正统权威。从第24集到第30集专业讲解:汇编语言程 ...

这两天抽空也要去看一下汇编了

alanma 发表于 2024-3-21 12:32:36

神农鼎 发表于 2024-3-21 10:02
你这还是不用 仿真器查你程序错在哪的问题 !
用 仿真器 深入进去,看你程序错在哪的手段:
单步运行,运行 ...

仿真过,单步仿真几十个循环,都没有这个现象,怪就怪在这里,程序自己运行的时候就有{:5_271:}
页: [1] 2
查看完整版本: PWM输出影响数码管