共3条
1/1 1 跳转至页
2052ad,98,PWM 这是2052ad资料上98页程序抽取的PWM测试代码,姚工请进
问
在我这里12c2052ad,用内置振荡器pwm周期为240us左右(这里比较古怪,因为同样的代码昨天测得的是85-90us左右的)
用外部11.0592M,pwm周期为120us左右(这个昨天测得的是50us左右的)
不知道为什么会不同呢?
不知道是不是哪儿处理不当呢.请帮我休整一下吧.先谢谢了.
哪位大哥如果有时间的也检测一下,报一下测到的周期.
-----------------------------------------------------
这里就结帖了,嗨,真是怪事年年有阿,今天终于把芯片丢到垃圾桶里面了,后来又想,不会吧,弄了那么些天了就那么几条语句,怎么会不行呢,就算是pwm不行了,也还可以用其他的功能阿,玩一下其他的吧,结果是下了其他程序玩了一个下午,后来顺手把原来写的那段程序下下去一看,晕~~,竟然出来43us左右的pwm方波!!竟然是这个.(用内置时钟)
弄不清楚之下又再改动里面的内容,下载,,,结果还是43k左右,嘿,怪胎阿,真不知道怎么说好了.
要是有知道原因的,或帮我分析一下,没有的就算了,反正这个帖子也没有人回答的.当我自言自语就算了. 答 1: 能给个pwm最大输出频率测试代码吗?上面的代码出来的频率确实得不到资料上所说的频率阿. 答 2: 有人能帮我一下吗告诉我程序里面哪儿出错了? 答 3: 网友答复您: stcmcu没骗您答GT2000网友,被您害的又做了一次 0+0 = 0 的工作,现请您放心使用
您质疑我们 PWM 问题的帖子,
---早有网友答复您: stcmcu没骗您
---我早有答复,参考 STC12C2052AD系列单片机用户手册(2006-8-7),第xx页
所以我们认为我们已经答复的够清楚了,不想讲"肯定是您错了"
我们是没有时间看大伙的程序的,所以开此坛的目的
===大家互相帮忙,基本上我们只是起一个引导的作用
我们原则上在一个贴子上只能花5分钟,解决不了,就放弃
幸好,广大网友几乎多互相帮助解决了
但您此帖,好象大家多知道您错了,也不肯贴个程序给您
我只好利用周末再次测试了一次,完全达到要求
18,432,000Hz / 256 = 72,000Hz
========以下程序费时 30分钟,验证完全正确=========================
;晶振频率 Fosc = 18.432MHz,在P3.7输出72KHz 方波
;------------------------------------------------------------------------------
;声明 STC12C2052AD和STC12C5410AD系列 MCU 特殊功能寄存器地址
AUXR EQU 8EH
CH EQU 0F9H ;PCA 计数器高8位。
CL EQU 0E9H ;PCA 计数器低8位。
;------------------------
CCON EQU 0D8H ;PCA 控制寄存器。
CR EQU CCON.6 ;1:允许 PCA 计数器计数, 必须由软件清0。
CF EQU CCON.7 ;PCA计数器溢出(CH,CL由 FFFFH 变为 0000H)标志,
;PCA计数器溢出后由硬件置位,必须由软件清0。
;------------------------
CMOD EQU 0D9H ;PCA 工作模式寄存器。
;CMOD.7 CIDL: idle 状态时 PCA 计数器是否继续计数, 0: 继续计数, 1: 停止计数。
;CMOD.2 CPS1: PCA 计数器计数脉冲源选择位 1。
;CMOD.1 CPS0: PCA 计数器计数脉冲源选择位 0。
; CPS1 CPS0
; 0 0 外部晶体频率/12。
; 0 1 外部晶体频率/2。
; 1 0 Timer 0 溢出脉冲,
; Timer 0 还可通过 AUXR寄存器设置成工作在 12T 或 1T 模式。
; 1 1 从 ECI/P3.4 脚输入的外部时钟。
;CMOD.0 ECF: PCA计数器溢出中断允许位, 1--允许 CF(CCON.7) 产生中断。
;------------------------
CCAP0H EQU 0FAH ;PCA 模块0的捕捉/比较寄存器高 8 位。
CCAP1H EQU 0FBH ;PCA 模块1的捕捉/比较寄存器高 8 位。
CCAP0L EQU 0EAH ;PCA 模块0的捕捉/比较寄存器低 8 位。
CCAP1L EQU 0EBH ;PCA 模块1的捕捉/比较寄存器低 8 位。
;------------------------
PCA_PWM0 EQU 0F2H ;PCA 模块0 PWM 寄存器。
PCA_PWM1 EQU 0F3H ;PCA 模块1 PWM 寄存器。
;PCA_PWMn: 7 6 5 4 3 2 1 0
; - - - - - - EPCnH EPCnL
;B7-B2: 保留
;B1(EPCnH): 在 PWM 模式下,与 CCAPnH 组成 9 位数。
;B0(EPCnL): 在 PWM 模式下,与 CCAPnL 组成 9 位数。
;------------------------
CCAPM0 EQU 0DAH ;PCA 模块0的工作模式寄存器。
CCAPM1 EQU 0DBH ;PCA 模块1的工作模式寄存器。
;CCAPMn: 7 6 5 4 3 2 1 0
; - ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
;
;ECOMn = 1:允许比较功能。
;CAPPn = 1:允许上升沿触发捕捉功能。
;CAPNn = 1:允许下降沿触发捕捉功能。
;MATn = 1:当匹配情况发生时, 允许 CCON 中的 CCFn 置位。
;TOGn = 1:当匹配情况发生时, CEXn 将翻转。
;PWMn = 1:将 CEXn 设置为 PWM 输出。
;ECCFn = 1:允许 CCON 中的 CCFn 触发中断。
;ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
; 0 0 0 0 0 0 0 00H 未启用任何功能。
; x 1 0 0 0 0 x 21H 16位CEXn上升沿触发捕捉功能。
; x 0 1 0 0 0 x 11H 16位CEXn下降沿触发捕捉功能。
; x 1 1 0 0 0 x 31H 16位CEXn边沿(上、下沿)触发捕捉功能。
; 1 0 0 1 0 0 x 49H 16位软件定时器。
; 1 0 0 1 1 0 x 4DH 16位高速脉冲输出。
; 1 0 0 0 0 1 0 42H 8位 PWM。
;------------------------------------------------------------------------------
LED_MCU_START EQU P1.7
Timer0_Reload_1 EQU 0FFH ;Timer0 自动重装数 = 255, 计一个脉冲就溢出
PWM_PULSE_WIDTH EQU 080H ;数字越大脉宽越窄(占空比越小),P3.7 的 LED 越亮。
;------------------------------------------------------------------------------
ORG 0000H
LJMP MAIN
;------------------------------------------------------------------------------
ORG 0050H
MAIN:
CLR LED_MCU_START ;点亮 MCU 开始工作指示灯
MOV SP, #7FH
ACALL Timer0_Initiate ;初始化 T0
ACALL PWM_Initiate ;初始化 PCA
WAIT:
SJMP WAIT
;------------------------------------------------------------------------------
Timer0_Initiate:
;初始化 T0, 其溢出脉冲作 PCA 计数器(CH,CL)的时钟源
MOV TMOD, #02H ;设置定时器0 为自动重装工作模式
MOV TH0, #Timer0_Reload_1 ; 0FFH
MOV TL0, #Timer0_Reload_1 ; 0FFH
;*********************************************************
ORL AUXR, #10000000B ;定时器0工作在1T模式
;*********************************************************
SETB TR0 ;启动定时器0
RET
;------------------------------------------------------------------------------
PWM_Initiate:
MOV CMOD, #00000100B ;PCA/PWM 时钟源为 定时器0 (T0) 的溢出率
MOV CCON, #00H ;CF = 0,清0 PCA 计数器溢出中断请求标志位
;CR = 0, 不允许 PCA 计数器计数
;清0 PCA 各模块中断请求标志位,如 CCF1,CCF0
MOV CL, #00H ;清0 PCA 计数器
MOV CH, #00H
;-------------------------
;设置模块0为 8 位 PWM 输出模式, PWM 无需中断支持。脉冲在P3.7(第11脚)输出
MOV CCAPM0, #42H ; 设置模块0为 8 位 PWM输出模式
MOV CCAP0L, #PWM_PULSE_WIDTH ;080H
MOV CCAP0H, #PWM_PULSE_WIDTH ; 080H
SETB CR ;启动 PCA 计数器(CH,CL)计数
RET
;------------------------------------------------------------------------------
END
答 4: STCMCU麻烦你了虽然我早前已经不明不白地弄好了,但是还是要感谢一下你,也为以后为pwm苦恼的网友感谢一下阿,最好是把这个检测程序放到资料里,不要让太多的人因为怀疑而走弯路.
不过说真的,这个cpu真的有点古怪的,你看看lgj网友的回话,他得到的18.432MHz的时钟出来的pwm最大是38k的方波,这说明很多网友还不知道怎么掌控pwm.(或许他遇到了跟我一样的芯片了,就是cpu内部有点儿问题,需要使用过1T的uart后才会好,而他一直都没有使用,所以得不到37kHz的pwm频率)
看了你的程序,里面主要参数的设置和我的程序没有出入,我的程序后来也没有经过一丝修改就通过了,不过我发现一个很怪的问题,就是当pwm不正常的时候,串口很慢,当pwm正常的时候串口超快的.(仅是怀疑而已,因为后面的程序因为怀疑1T的问题,所以做了uart1T的测试,但是发觉没有问题,后来再下原来的才好了的)
是不是下载存在一些缺陷呢,现在还不得而知,我在硬件和软件都没有做任何改动的情况下得到了不同的pwm,而且不是一次,是好几次不同的结果,情况是在我把其它程序下载到CPU后,再重新下载原来的程序后得到改变的. 答 5: 感谢您选择我们,支持我们,我回此贴,只是想让论坛热闹一下我们是一次通过,用我们下载板测的,也是在以前程序基础上调整参数就对了
---感谢您选择我们,支持我们,我回此贴,只是想让论坛热闹一下
ORG 0000H
LJMP MAIN
;------------------------------------------------------------------------------
ORG 0050H
MAIN:
CLR LED_MCU_START ;点亮 MCU 开始工作指示灯
MOV SP, #7FH
ACALL Timer0_Initiate ;初始化 T0
ACALL PWM_Initiate ;初始化 PCA
WAIT:
SJMP WAIT
;------------------------------------------------------------------------------
Timer0_Initiate:
;初始化 T0, 其溢出脉冲作 PCA 计数器(CH,CL)的时钟源
MOV TMOD, #02H ;设置定时器0 为自动重装工作模式
MOV TH0, #Timer0_Reload_1 ; 0FFH
MOV TL0, #Timer0_Reload_1 ; 0FFH
;*********************************************************
ORL AUXR, #10000000B ;定时器0工作在1T模式
;*********************************************************
SETB TR0 ;启动定时器0
RET
;------------------------------------------------------------------------------
PWM_Initiate:
MOV CMOD, #00000100B ;PCA/PWM 时钟源为 定时器0 (T0) 的溢出率
MOV CCON, #00H ;CF = 0,清0 PCA 计数器溢出中断请求标志位
;CR = 0, 不允许 PCA 计数器计数
;清0 PCA 各模块中断请求标志位,如 CCF1,CCF0
MOV CL, #00H ;清0 PCA 计数器
MOV CH, #00H
;-------------------------
;设置模块0为 8 位 PWM 输出模式, PWM 无需中断支持。脉冲在P3.7(第11脚)输出
MOV CCAPM0, #42H ; 设置模块0为 8 位 PWM输出模式
MOV CCAP0L, #PWM_PULSE_WIDTH ;080H
MOV CCAP0H, #PWM_PULSE_WIDTH ; 080H
SETB CR ;启动 PCA 计数器(CH,CL)计数
RET
;------------------------------------------------------------------------------
END
用外部11.0592M,pwm周期为120us左右(这个昨天测得的是50us左右的)
不知道为什么会不同呢?
不知道是不是哪儿处理不当呢.请帮我休整一下吧.先谢谢了.
哪位大哥如果有时间的也检测一下,报一下测到的周期.
-----------------------------------------------------
这里就结帖了,嗨,真是怪事年年有阿,今天终于把芯片丢到垃圾桶里面了,后来又想,不会吧,弄了那么些天了就那么几条语句,怎么会不行呢,就算是pwm不行了,也还可以用其他的功能阿,玩一下其他的吧,结果是下了其他程序玩了一个下午,后来顺手把原来写的那段程序下下去一看,晕~~,竟然出来43us左右的pwm方波!!竟然是这个.(用内置时钟)
弄不清楚之下又再改动里面的内容,下载,,,结果还是43k左右,嘿,怪胎阿,真不知道怎么说好了.
要是有知道原因的,或帮我分析一下,没有的就算了,反正这个帖子也没有人回答的.当我自言自语就算了. 答 1: 能给个pwm最大输出频率测试代码吗?上面的代码出来的频率确实得不到资料上所说的频率阿. 答 2: 有人能帮我一下吗告诉我程序里面哪儿出错了? 答 3: 网友答复您: stcmcu没骗您答GT2000网友,被您害的又做了一次 0+0 = 0 的工作,现请您放心使用
您质疑我们 PWM 问题的帖子,
---早有网友答复您: stcmcu没骗您
---我早有答复,参考 STC12C2052AD系列单片机用户手册(2006-8-7),第xx页
所以我们认为我们已经答复的够清楚了,不想讲"肯定是您错了"
我们是没有时间看大伙的程序的,所以开此坛的目的
===大家互相帮忙,基本上我们只是起一个引导的作用
我们原则上在一个贴子上只能花5分钟,解决不了,就放弃
幸好,广大网友几乎多互相帮助解决了
但您此帖,好象大家多知道您错了,也不肯贴个程序给您
我只好利用周末再次测试了一次,完全达到要求
18,432,000Hz / 256 = 72,000Hz
========以下程序费时 30分钟,验证完全正确=========================
;晶振频率 Fosc = 18.432MHz,在P3.7输出72KHz 方波
;------------------------------------------------------------------------------
;声明 STC12C2052AD和STC12C5410AD系列 MCU 特殊功能寄存器地址
AUXR EQU 8EH
CH EQU 0F9H ;PCA 计数器高8位。
CL EQU 0E9H ;PCA 计数器低8位。
;------------------------
CCON EQU 0D8H ;PCA 控制寄存器。
CR EQU CCON.6 ;1:允许 PCA 计数器计数, 必须由软件清0。
CF EQU CCON.7 ;PCA计数器溢出(CH,CL由 FFFFH 变为 0000H)标志,
;PCA计数器溢出后由硬件置位,必须由软件清0。
;------------------------
CMOD EQU 0D9H ;PCA 工作模式寄存器。
;CMOD.7 CIDL: idle 状态时 PCA 计数器是否继续计数, 0: 继续计数, 1: 停止计数。
;CMOD.2 CPS1: PCA 计数器计数脉冲源选择位 1。
;CMOD.1 CPS0: PCA 计数器计数脉冲源选择位 0。
; CPS1 CPS0
; 0 0 外部晶体频率/12。
; 0 1 外部晶体频率/2。
; 1 0 Timer 0 溢出脉冲,
; Timer 0 还可通过 AUXR寄存器设置成工作在 12T 或 1T 模式。
; 1 1 从 ECI/P3.4 脚输入的外部时钟。
;CMOD.0 ECF: PCA计数器溢出中断允许位, 1--允许 CF(CCON.7) 产生中断。
;------------------------
CCAP0H EQU 0FAH ;PCA 模块0的捕捉/比较寄存器高 8 位。
CCAP1H EQU 0FBH ;PCA 模块1的捕捉/比较寄存器高 8 位。
CCAP0L EQU 0EAH ;PCA 模块0的捕捉/比较寄存器低 8 位。
CCAP1L EQU 0EBH ;PCA 模块1的捕捉/比较寄存器低 8 位。
;------------------------
PCA_PWM0 EQU 0F2H ;PCA 模块0 PWM 寄存器。
PCA_PWM1 EQU 0F3H ;PCA 模块1 PWM 寄存器。
;PCA_PWMn: 7 6 5 4 3 2 1 0
; - - - - - - EPCnH EPCnL
;B7-B2: 保留
;B1(EPCnH): 在 PWM 模式下,与 CCAPnH 组成 9 位数。
;B0(EPCnL): 在 PWM 模式下,与 CCAPnL 组成 9 位数。
;------------------------
CCAPM0 EQU 0DAH ;PCA 模块0的工作模式寄存器。
CCAPM1 EQU 0DBH ;PCA 模块1的工作模式寄存器。
;CCAPMn: 7 6 5 4 3 2 1 0
; - ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
;
;ECOMn = 1:允许比较功能。
;CAPPn = 1:允许上升沿触发捕捉功能。
;CAPNn = 1:允许下降沿触发捕捉功能。
;MATn = 1:当匹配情况发生时, 允许 CCON 中的 CCFn 置位。
;TOGn = 1:当匹配情况发生时, CEXn 将翻转。
;PWMn = 1:将 CEXn 设置为 PWM 输出。
;ECCFn = 1:允许 CCON 中的 CCFn 触发中断。
;ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
; 0 0 0 0 0 0 0 00H 未启用任何功能。
; x 1 0 0 0 0 x 21H 16位CEXn上升沿触发捕捉功能。
; x 0 1 0 0 0 x 11H 16位CEXn下降沿触发捕捉功能。
; x 1 1 0 0 0 x 31H 16位CEXn边沿(上、下沿)触发捕捉功能。
; 1 0 0 1 0 0 x 49H 16位软件定时器。
; 1 0 0 1 1 0 x 4DH 16位高速脉冲输出。
; 1 0 0 0 0 1 0 42H 8位 PWM。
;------------------------------------------------------------------------------
LED_MCU_START EQU P1.7
Timer0_Reload_1 EQU 0FFH ;Timer0 自动重装数 = 255, 计一个脉冲就溢出
PWM_PULSE_WIDTH EQU 080H ;数字越大脉宽越窄(占空比越小),P3.7 的 LED 越亮。
;------------------------------------------------------------------------------
ORG 0000H
LJMP MAIN
;------------------------------------------------------------------------------
ORG 0050H
MAIN:
CLR LED_MCU_START ;点亮 MCU 开始工作指示灯
MOV SP, #7FH
ACALL Timer0_Initiate ;初始化 T0
ACALL PWM_Initiate ;初始化 PCA
WAIT:
SJMP WAIT
;------------------------------------------------------------------------------
Timer0_Initiate:
;初始化 T0, 其溢出脉冲作 PCA 计数器(CH,CL)的时钟源
MOV TMOD, #02H ;设置定时器0 为自动重装工作模式
MOV TH0, #Timer0_Reload_1 ; 0FFH
MOV TL0, #Timer0_Reload_1 ; 0FFH
;*********************************************************
ORL AUXR, #10000000B ;定时器0工作在1T模式
;*********************************************************
SETB TR0 ;启动定时器0
RET
;------------------------------------------------------------------------------
PWM_Initiate:
MOV CMOD, #00000100B ;PCA/PWM 时钟源为 定时器0 (T0) 的溢出率
MOV CCON, #00H ;CF = 0,清0 PCA 计数器溢出中断请求标志位
;CR = 0, 不允许 PCA 计数器计数
;清0 PCA 各模块中断请求标志位,如 CCF1,CCF0
MOV CL, #00H ;清0 PCA 计数器
MOV CH, #00H
;-------------------------
;设置模块0为 8 位 PWM 输出模式, PWM 无需中断支持。脉冲在P3.7(第11脚)输出
MOV CCAPM0, #42H ; 设置模块0为 8 位 PWM输出模式
MOV CCAP0L, #PWM_PULSE_WIDTH ;080H
MOV CCAP0H, #PWM_PULSE_WIDTH ; 080H
SETB CR ;启动 PCA 计数器(CH,CL)计数
RET
;------------------------------------------------------------------------------
END
答 4: STCMCU麻烦你了虽然我早前已经不明不白地弄好了,但是还是要感谢一下你,也为以后为pwm苦恼的网友感谢一下阿,最好是把这个检测程序放到资料里,不要让太多的人因为怀疑而走弯路.
不过说真的,这个cpu真的有点古怪的,你看看lgj网友的回话,他得到的18.432MHz的时钟出来的pwm最大是38k的方波,这说明很多网友还不知道怎么掌控pwm.(或许他遇到了跟我一样的芯片了,就是cpu内部有点儿问题,需要使用过1T的uart后才会好,而他一直都没有使用,所以得不到37kHz的pwm频率)
看了你的程序,里面主要参数的设置和我的程序没有出入,我的程序后来也没有经过一丝修改就通过了,不过我发现一个很怪的问题,就是当pwm不正常的时候,串口很慢,当pwm正常的时候串口超快的.(仅是怀疑而已,因为后面的程序因为怀疑1T的问题,所以做了uart1T的测试,但是发觉没有问题,后来再下原来的才好了的)
是不是下载存在一些缺陷呢,现在还不得而知,我在硬件和软件都没有做任何改动的情况下得到了不同的pwm,而且不是一次,是好几次不同的结果,情况是在我把其它程序下载到CPU后,再重新下载原来的程序后得到改变的. 答 5: 感谢您选择我们,支持我们,我回此贴,只是想让论坛热闹一下我们是一次通过,用我们下载板测的,也是在以前程序基础上调整参数就对了
---感谢您选择我们,支持我们,我回此贴,只是想让论坛热闹一下
ORG 0000H
LJMP MAIN
;------------------------------------------------------------------------------
ORG 0050H
MAIN:
CLR LED_MCU_START ;点亮 MCU 开始工作指示灯
MOV SP, #7FH
ACALL Timer0_Initiate ;初始化 T0
ACALL PWM_Initiate ;初始化 PCA
WAIT:
SJMP WAIT
;------------------------------------------------------------------------------
Timer0_Initiate:
;初始化 T0, 其溢出脉冲作 PCA 计数器(CH,CL)的时钟源
MOV TMOD, #02H ;设置定时器0 为自动重装工作模式
MOV TH0, #Timer0_Reload_1 ; 0FFH
MOV TL0, #Timer0_Reload_1 ; 0FFH
;*********************************************************
ORL AUXR, #10000000B ;定时器0工作在1T模式
;*********************************************************
SETB TR0 ;启动定时器0
RET
;------------------------------------------------------------------------------
PWM_Initiate:
MOV CMOD, #00000100B ;PCA/PWM 时钟源为 定时器0 (T0) 的溢出率
MOV CCON, #00H ;CF = 0,清0 PCA 计数器溢出中断请求标志位
;CR = 0, 不允许 PCA 计数器计数
;清0 PCA 各模块中断请求标志位,如 CCF1,CCF0
MOV CL, #00H ;清0 PCA 计数器
MOV CH, #00H
;-------------------------
;设置模块0为 8 位 PWM 输出模式, PWM 无需中断支持。脉冲在P3.7(第11脚)输出
MOV CCAPM0, #42H ; 设置模块0为 8 位 PWM输出模式
MOV CCAP0L, #PWM_PULSE_WIDTH ;080H
MOV CCAP0H, #PWM_PULSE_WIDTH ; 080H
SETB CR ;启动 PCA 计数器(CH,CL)计数
RET
;------------------------------------------------------------------------------
END
共3条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |