我用AT89C51来产生PWM……麻烦了,做不出来
求助!!!!
谢谢
我用AT89C51来产生PWM……麻烦了,做不出来
全部回复(40)
正序查看
倒序查看
现在还没有回复呢,说说你的想法
理论可以,不过标准51的话1us为最小指令周期-》1M,去掉中断响应:至少一个周期吧第一个长跳转:好像是3个周期?push 若干个查表(计算)若干个赋值若干个pop XX 若干个最后中断返回:1个还是两个?如果还要求是中心对齐的PWM,能产生10K的PWM都勉强,像你说的:你有麻烦了,如果你再用C而不是汇编 ^_^ 你有麻烦了.这还有分辨率的事没说呢!此路不通! 有一次逼得我就在T2中断入口后面直接写-没长跳转,节省3个周期,不过是我错了,因为是可以用常熟自动装载的.用DSP吧,不过我现在还不会.2407大约就几十K,所以现在出28XX了.数字电路的晶体频率听起来很吓人,一算下来:我有麻烦了.
0
回复
提示
@qihao
理论可以,不过标准51的话1us为最小指令周期-》1M,去掉中断响应:至少一个周期吧第一个长跳转:好像是3个周期?push 若干个查表(计算)若干个赋值若干个pop XX 若干个最后中断返回:1个还是两个?如果还要求是中心对齐的PWM,能产生10K的PWM都勉强,像你说的:你有麻烦了,如果你再用C而不是汇编 ^_^ 你有麻烦了.这还有分辨率的事没说呢!此路不通! 有一次逼得我就在T2中断入口后面直接写-没长跳转,节省3个周期,不过是我错了,因为是可以用常熟自动装载的.用DSP吧,不过我现在还不会.2407大约就几十K,所以现在出28XX了.数字电路的晶体频率听起来很吓人,一算下来:我有麻烦了.
听到你说“此路不通”好伤心啊……
不过现在就是用标准51,汇编语言编程.
如果分辨率可调整的话,那你觉得要考虑哪些问题呢?
我现在是要它行的通……只是我还行不通
不过现在就是用标准51,汇编语言编程.
如果分辨率可调整的话,那你觉得要考虑哪些问题呢?
我现在是要它行的通……只是我还行不通
0
回复
提示
@qiuyy
这个应该是可以做的吧.你首先要定义两个变量:一个是叫周期T,另一外一个占空比D.T的值要大于D,首先让I/O口输出高电平,让T,D同进计数,当D已经到了预计值的时候,则I/0变为低,然后低电平一直延续到T的值.当T的值到的时候,I/O口拉高.改变D,T的时间可以控制频率,改变D的值可以达到占空比的变化.这个思路很重要.这种算法要用到定时器,只要单片机时钟频率足够高,可以任意改变PWM的频率.
TO qinuyy: 现在我是要用MCS-5系列单片机,软件编程实现脉宽调制PWM的正弦波,然后根据串行口的高、低电平产生频移键控信号并发送,最终实现CPFSK的调制...
如你所说,我必须选择带有AD转换,PWM模块的51系列芯片,要不没有办法检测电压电流……这里我有点不懂...请指教!!!
谢谢!!!
如你所说,我必须选择带有AD转换,PWM模块的51系列芯片,要不没有办法检测电压电流……这里我有点不懂...请指教!!!
谢谢!!!
0
回复
提示
@qihao
"频移键控信号"是什么样的信号,说来听听,我也感兴趣,大家来评估一下实现方法.如果不是用来做开关电源,也许行,我以为你是说做开关电源呢
二进制数字频率调制(2FSK)是利用二进制数字基带信号控制载波的频率进行频谱变换的过程.在发送端,产生不同频率的载波振荡来传输数字信息“1”或“0”,在接收端,不不同频率的载波振荡还原成响应的数字基带信号.FSK有相位连续(CPFSK)和相位不连续(DPFSK)之分.
在这里所说的CPFSK,就是相位连续的频移键控调制.
现在就是计划用MCS51系列单片机来产生一路PWM信号(或者两路),不是用来做开关电源的..
请问有什么可行的办法?
我还没有做出来..
谢谢!
在这里所说的CPFSK,就是相位连续的频移键控调制.
现在就是计划用MCS51系列单片机来产生一路PWM信号(或者两路),不是用来做开关电源的..
请问有什么可行的办法?
我还没有做出来..
谢谢!
0
回复
提示
@清泉石上流
二进制数字频率调制(2FSK)是利用二进制数字基带信号控制载波的频率进行频谱变换的过程.在发送端,产生不同频率的载波振荡来传输数字信息“1”或“0”,在接收端,不不同频率的载波振荡还原成响应的数字基带信号.FSK有相位连续(CPFSK)和相位不连续(DPFSK)之分. 在这里所说的CPFSK,就是相位连续的频移键控调制. 现在就是计划用MCS51系列单片机来产生一路PWM信号(或者两路),不是用来做开关电源的.. 请问有什么可行的办法? 我还没有做出来.. 谢谢!
是不是就是调频信号:一个频率表示1,一个表示0?
哪就是可以用常数自动装载,AT的T2可以的,这个时atmel扩展的标准51功能,以前我用来发生红外调制基波,估计能是你说的那样.记住:常数自动装载,CPU设定一次后无需再干预
不过解调呢? 测脉宽来解调?忘了当时咋做的
哪就是可以用常数自动装载,AT的T2可以的,这个时atmel扩展的标准51功能,以前我用来发生红外调制基波,估计能是你说的那样.记住:常数自动装载,CPU设定一次后无需再干预
不过解调呢? 测脉宽来解调?忘了当时咋做的
0
回复
提示
@qihao
其实搭两个方波振荡,用串口数据直接控制一个电子开关呢?发送CPU就免干预了,只要做解调工作
TO qiuyy:
如你所说,就是用中断的方式来实现吧.如果是采用查表的方式的实现,会不会很麻烦?
500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/28/1112967578.gif');}" onmousewheel="return imgzoom(this);">
正弦波PWM调制就是使调制出的波形尽可能接近正弦波.象上图的那样,在调制过程中使每个时段内上下图对应的阴影部分面积相等.由于正弦波是对称的,那就要求时段的分割数是偶数.如果采取这种方式的话,那是不是要用查询的方式来完成?这样的话,那不是要占用大量的内存来存放数据吗?就假设单片机的时钟频率为12MHz,调制时段数分到52的话……
能说说各自的出发点所在吗?
谢谢!
如你所说,就是用中断的方式来实现吧.如果是采用查表的方式的实现,会不会很麻烦?
500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/28/1112967578.gif');}" onmousewheel="return imgzoom(this);">
正弦波PWM调制就是使调制出的波形尽可能接近正弦波.象上图的那样,在调制过程中使每个时段内上下图对应的阴影部分面积相等.由于正弦波是对称的,那就要求时段的分割数是偶数.如果采取这种方式的话,那是不是要用查询的方式来完成?这样的话,那不是要占用大量的内存来存放数据吗?就假设单片机的时钟频率为12MHz,调制时段数分到52的话……
能说说各自的出发点所在吗?
谢谢!
0
回复
提示
@清泉石上流
TO qiuyy: 如你所说,就是用中断的方式来实现吧.如果是采用查表的方式的实现,会不会很麻烦? [图片]500){this.resized=true;this.width=500;this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}"onclick="if(!this.resized){returntrue;}else{window.open('http://u.dianyuan.com/bbs/u/28/1112967578.gif');}"onmousewheel="returnimgzoom(this);"> 正弦波PWM调制就是使调制出的波形尽可能接近正弦波.象上图的那样,在调制过程中使每个时段内上下图对应的阴影部分面积相等.由于正弦波是对称的,那就要求时段的分割数是偶数.如果采取这种方式的话,那是不是要用查询的方式来完成?这样的话,那不是要占用大量的内存来存放数据吗?就假设单片机的时钟频率为12MHz,调制时段数分到52的话…… 能说说各自的出发点所在吗? 谢谢!
你把要调制的数据变成表格也可以的.首先你要明白什么是PWM,好好地分析D(占空比)和T(周期)的关系.再构思一下.这个算法也是我以前想出来的.当然如果你要用程序做成正弦的话,你可以选用DA转换,这也个也不难做.
0
回复
提示
@grtang
thankyourhelp.
TO qiuyy:
谢谢您!我明白您的意思.
假设MCS51的串行数据速率I(由软件设置,硬件自动产生MOV SCON ****),数据电平“1”的调制频率为f1,数据电平“0”的调制频率为f0,通过软件检测MCS51的串行数据输出端口TXD对数据进行调制.
首先让I/O口(如P1.3)输出高电平,然后检测TXD.当TXD输出为“1”时,进行频率为f1的调制;当TXD输出为“0”时,进行频率为f0的调制.接着让I/O口(如P1.3)输出低电平,并检测TXD,重复上面的步骤.这样的话,要实现PWM输出,还是用中断来实现吗?
你所说的占空比和数据电平的调制频率f0、f1有什么必然的联系?
PWM输出后经稳压、滤波,就可得到经过调制的相位连续正弦波.
谢谢您!我明白您的意思.
假设MCS51的串行数据速率I(由软件设置,硬件自动产生MOV SCON ****),数据电平“1”的调制频率为f1,数据电平“0”的调制频率为f0,通过软件检测MCS51的串行数据输出端口TXD对数据进行调制.
首先让I/O口(如P1.3)输出高电平,然后检测TXD.当TXD输出为“1”时,进行频率为f1的调制;当TXD输出为“0”时,进行频率为f0的调制.接着让I/O口(如P1.3)输出低电平,并检测TXD,重复上面的步骤.这样的话,要实现PWM输出,还是用中断来实现吗?
你所说的占空比和数据电平的调制频率f0、f1有什么必然的联系?
PWM输出后经稳压、滤波,就可得到经过调制的相位连续正弦波.
0
回复
提示
@清泉石上流
TOqiuyy: 谢谢您!我明白您的意思. 假设MCS51的串行数据速率I(由软件设置,硬件自动产生MOVSCON****),数据电平“1”的调制频率为f1,数据电平“0”的调制频率为f0,通过软件检测MCS51的串行数据输出端口TXD对数据进行调制. 首先让I/O口(如P1.3)输出高电平,然后检测TXD.当TXD输出为“1”时,进行频率为f1的调制;当TXD输出为“0”时,进行频率为f0的调制.接着让I/O口(如P1.3)输出低电平,并检测TXD,重复上面的步骤.这样的话,要实现PWM输出,还是用中断来实现吗? 你所说的占空比和数据电平的调制频率f0、f1有什么必然的联系? PWM输出后经稳压、滤波,就可得到经过调制的相位连续正弦波.
的确有水平!
0
回复
提示
@清泉石上流
TOqiuyy: 谢谢您!我明白您的意思. 假设MCS51的串行数据速率I(由软件设置,硬件自动产生MOVSCON****),数据电平“1”的调制频率为f1,数据电平“0”的调制频率为f0,通过软件检测MCS51的串行数据输出端口TXD对数据进行调制. 首先让I/O口(如P1.3)输出高电平,然后检测TXD.当TXD输出为“1”时,进行频率为f1的调制;当TXD输出为“0”时,进行频率为f0的调制.接着让I/O口(如P1.3)输出低电平,并检测TXD,重复上面的步骤.这样的话,要实现PWM输出,还是用中断来实现吗? 你所说的占空比和数据电平的调制频率f0、f1有什么必然的联系? PWM输出后经稳压、滤波,就可得到经过调制的相位连续正弦波.
it's also a good wayt to produce the PLUS Of PWM.But the F is limited!
0
回复
提示
@qihao
理论可以,不过标准51的话1us为最小指令周期-》1M,去掉中断响应:至少一个周期吧第一个长跳转:好像是3个周期?push 若干个查表(计算)若干个赋值若干个pop XX 若干个最后中断返回:1个还是两个?如果还要求是中心对齐的PWM,能产生10K的PWM都勉强,像你说的:你有麻烦了,如果你再用C而不是汇编 ^_^ 你有麻烦了.这还有分辨率的事没说呢!此路不通! 有一次逼得我就在T2中断入口后面直接写-没长跳转,节省3个周期,不过是我错了,因为是可以用常熟自动装载的.用DSP吧,不过我现在还不会.2407大约就几十K,所以现在出28XX了.数字电路的晶体频率听起来很吓人,一算下来:我有麻烦了.
用P4,大概就没问题吧?
0
回复
提示
@清泉石上流
limited? Howto increasetheF?byusinganotherone-chip?
TO qiuyy:您好!非常感谢您提供的思路!
●●可变脉宽PWM输出
用T0定时器控制PWM的占空比,T1定时器控制脉宽(最大65536μs.)
T0、T1定时器设置成16位定时器.
程序清单:(12MHz)
PwmData0 ;T0定时t1的初值(字)
PwmData1 ;T1定时T的初值(字)
;***************************
setb tro ;启动T0
setb tr1
……
T0Int:Clr tr0 ;T0中断服务程序
setb p1.0 ;PWM输出脚
reti
T1Int:Clr p1.0 ;T1中断服务程序
Clr tr0
Clr tr1
Mov TH0,High(PwmData0)
Mov TL0,Low(PwmData0)
Mov TH1,High(PwmData1)
Mov TL1,Low(PwmData1)
Setb tr1
Setb tr0
reti
说明:在主程序中计算PwmData0、PwmData1的值.
我有一个疑问:利用单片机MCS51实现可变脉宽PWM输出时,在主程序中计算PwmData0、PwmData1的值过程中,是采用查表的方式,还是动态计算呢?因为在每一次T1产生中断后,T1所装载的值都会改变,这样,假如:
1)采用查表的方式,那么就必须在T1INT程序段中加入读表、装载指令.那么大量的数据表就会占用了大量的存储单元,并且烦琐容易弄错.
2)采用动态计算,则需要在主程序中进行算术运算,并实现二进制向十六进制的转换,然后再装载进T1中,也很烦琐……
而且这样的话,会不会有时间上的延时问题?
另外还问一个弱弱的问题:单片机的串行输出口TXD能不能自动产生一系列的不规则的数字信号?应该如何实现呢??
请指点!!!
●●可变脉宽PWM输出
用T0定时器控制PWM的占空比,T1定时器控制脉宽(最大65536μs.)
T0、T1定时器设置成16位定时器.
程序清单:(12MHz)
PwmData0 ;T0定时t1的初值(字)
PwmData1 ;T1定时T的初值(字)
;***************************
setb tro ;启动T0
setb tr1
……
T0Int:Clr tr0 ;T0中断服务程序
setb p1.0 ;PWM输出脚
reti
T1Int:Clr p1.0 ;T1中断服务程序
Clr tr0
Clr tr1
Mov TH0,High(PwmData0)
Mov TL0,Low(PwmData0)
Mov TH1,High(PwmData1)
Mov TL1,Low(PwmData1)
Setb tr1
Setb tr0
reti
说明:在主程序中计算PwmData0、PwmData1的值.
我有一个疑问:利用单片机MCS51实现可变脉宽PWM输出时,在主程序中计算PwmData0、PwmData1的值过程中,是采用查表的方式,还是动态计算呢?因为在每一次T1产生中断后,T1所装载的值都会改变,这样,假如:
1)采用查表的方式,那么就必须在T1INT程序段中加入读表、装载指令.那么大量的数据表就会占用了大量的存储单元,并且烦琐容易弄错.
2)采用动态计算,则需要在主程序中进行算术运算,并实现二进制向十六进制的转换,然后再装载进T1中,也很烦琐……
而且这样的话,会不会有时间上的延时问题?
另外还问一个弱弱的问题:单片机的串行输出口TXD能不能自动产生一系列的不规则的数字信号?应该如何实现呢??
请指点!!!
0
回复
提示
@清泉石上流
TOqiuyy:您好!非常感谢您提供的思路! ●●可变脉宽PWM输出 用T0定时器控制PWM的占空比,T1定时器控制脉宽(最大65536μs.) T0、T1定时器设置成16位定时器. 程序清单:(12MHz) PwmData0 ;T0定时t1的初值(字) PwmData1 ;T1定时T的初值(字);*************************** setbtro ;启动T0 setbtr1 ……T0Int:Clr tr0 ;T0中断服务程序 setb p1.0 ;PWM输出脚 retiT1Int:Clr p1.0 ;T1中断服务程序 Clrtr0 Clrtr1 MovTH0,High(PwmData0) MovTL0,Low(PwmData0) MovTH1,High(PwmData1) MovTL1,Low(PwmData1) Setbtr1 Setbtr0 reti 说明:在主程序中计算PwmData0、PwmData1的值. 我有一个疑问:利用单片机MCS51实现可变脉宽PWM输出时,在主程序中计算PwmData0、PwmData1的值过程中,是采用查表的方式,还是动态计算呢?因为在每一次T1产生中断后,T1所装载的值都会改变,这样,假如: 1)采用查表的方式,那么就必须在T1INT程序段中加入读表、装载指令.那么大量的数据表就会占用了大量的存储单元,并且烦琐容易弄错. 2)采用动态计算,则需要在主程序中进行算术运算,并实现二进制向十六进制的转换,然后再装载进T1中,也很烦琐…… 而且这样的话,会不会有时间上的延时问题? 另外还问一个弱弱的问题:单片机的串行输出口TXD能不能自动产生一系列的不规则的数字信号?应该如何实现呢?? 请指点!!!
我想你用串口实现的话是可以实现一系列不规则的数字的.比如你装载不同的数据的时候.另外用查表和动态度计算的优点,要试试才知道.
0
回复
提示