• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

我用AT89C51来产生PWM……麻烦了,做不出来

我用AT89C51来产生PWM……麻烦了,做不出来

求助!!!!

谢谢
全部回复(40)
正序查看
倒序查看
grtang
LV.7
2
2005-04-05 13:37
频率是多少?分辨率又是多少?
0
回复
2005-04-05 13:58
怎么会出不来?查询和中断方式都可以完成,频率?分辨率?产生几路?
0
回复
2005-04-07 20:36
@老化中的镇流器
怎么会出不来?查询和中断方式都可以完成,频率?分辨率?产生几路?
假设频率是1K,分辨率为一个机器周期,产生1路……
应该怎么实现呢?
0
回复
qihao
LV.4
5
2005-04-07 22:42
理论可以,不过标准51的话1us为最小指令周期-》1M,去掉中断响应:至少一个周期吧第一个长跳转:好像是3个周期?push   若干个查表(计算)若干个赋值若干个pop  XX   若干个最后中断返回:1个还是两个?如果还要求是中心对齐的PWM,能产生10K的PWM都勉强,像你说的:你有麻烦了,如果你再用C而不是汇编    ^_^  你有麻烦了.这还有分辨率的事没说呢!此路不通!   有一次逼得我就在T2中断入口后面直接写-没长跳转,节省3个周期,不过是我错了,因为是可以用常熟自动装载的.用DSP吧,不过我现在还不会.2407大约就几十K,所以现在出28XX了.数字电路的晶体频率听起来很吓人,一算下来:我有麻烦了.
0
回复
qiuyy
LV.6
6
2005-04-08 13:27
这个应该是可以做的吧.你首先要定义两个变量:一个是叫周期T,另一外一个占空比D.T的值要大于D,首先让I/O口输出高电平,让T,D同进计数,当D已经到了预计值的时候,则I/0变为低,然后低电平一直延续到T的值.当T的值到的时候,I/O口拉高.改变D,T的时间可以控制频率,改变D的值可以达到占空比的变化.这个思路很重要.这种算法要用到定时器,只要单片机时钟频率足够高,可以任意改变PWM的频率.
0
回复
2005-04-08 13:32
@qihao
理论可以,不过标准51的话1us为最小指令周期-》1M,去掉中断响应:至少一个周期吧第一个长跳转:好像是3个周期?push  若干个查表(计算)若干个赋值若干个pop  XX  若干个最后中断返回:1个还是两个?如果还要求是中心对齐的PWM,能产生10K的PWM都勉强,像你说的:你有麻烦了,如果你再用C而不是汇编    ^_^  你有麻烦了.这还有分辨率的事没说呢!此路不通!  有一次逼得我就在T2中断入口后面直接写-没长跳转,节省3个周期,不过是我错了,因为是可以用常熟自动装载的.用DSP吧,不过我现在还不会.2407大约就几十K,所以现在出28XX了.数字电路的晶体频率听起来很吓人,一算下来:我有麻烦了.
听到你说“此路不通”好伤心啊……
不过现在就是用标准51,汇编语言编程.
如果分辨率可调整的话,那你觉得要考虑哪些问题呢?
我现在是要它行的通……只是我还行不通
0
回复
2005-04-08 13:38
@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系列芯片,要不没有办法检测电压电流……这里我有点不懂...请指教!!!
    谢谢!!!
0
回复
qihao
LV.4
9
2005-04-08 14:08
@清泉石上流
TOqinuyy:现在我是要用MCS-5系列单片机,软件编程实现脉宽调制PWM的正弦波,然后根据串行口的高、低电平产生频移键控信号并发送,最终实现CPFSK的调制...    如你所说,我必须选择带有AD转换,PWM模块的51系列芯片,要不没有办法检测电压电流……这里我有点不懂...请指教!!!    谢谢!!!
"频移键控信号" 是什么样的信号,说来听听,我也感兴趣,大家来评估一下实现方法.如果不是用来做开关电源,也许行,我以为你是说做开关电源呢
0
回复
2005-04-08 16:58
@qihao
"频移键控信号"是什么样的信号,说来听听,我也感兴趣,大家来评估一下实现方法.如果不是用来做开关电源,也许行,我以为你是说做开关电源呢
二进制数字频率调制(2FSK)是利用二进制数字基带信号控制载波的频率进行频谱变换的过程.在发送端,产生不同频率的载波振荡来传输数字信息“1”或“0”,在接收端,不不同频率的载波振荡还原成响应的数字基带信号.FSK有相位连续(CPFSK)和相位不连续(DPFSK)之分.
    在这里所说的CPFSK,就是相位连续的频移键控调制.
    现在就是计划用MCS51系列单片机来产生一路PWM信号(或者两路),不是用来做开关电源的..
    请问有什么可行的办法?
    我还没有做出来..
    谢谢!
0
回复
qiuyy
LV.6
11
2005-04-08 18:00
@清泉石上流
二进制数字频率调制(2FSK)是利用二进制数字基带信号控制载波的频率进行频谱变换的过程.在发送端,产生不同频率的载波振荡来传输数字信息“1”或“0”,在接收端,不不同频率的载波振荡还原成响应的数字基带信号.FSK有相位连续(CPFSK)和相位不连续(DPFSK)之分.    在这里所说的CPFSK,就是相位连续的频移键控调制.    现在就是计划用MCS51系列单片机来产生一路PWM信号(或者两路),不是用来做开关电源的..    请问有什么可行的办法?    我还没有做出来..    谢谢!
俺讲得这么详细,还是做不出来??
0
回复
tase
LV.5
12
2005-04-08 18:17
@清泉石上流
二进制数字频率调制(2FSK)是利用二进制数字基带信号控制载波的频率进行频谱变换的过程.在发送端,产生不同频率的载波振荡来传输数字信息“1”或“0”,在接收端,不不同频率的载波振荡还原成响应的数字基带信号.FSK有相位连续(CPFSK)和相位不连续(DPFSK)之分.    在这里所说的CPFSK,就是相位连续的频移键控调制.    现在就是计划用MCS51系列单片机来产生一路PWM信号(或者两路),不是用来做开关电源的..    请问有什么可行的办法?    我还没有做出来..    谢谢!
用LPC900系列的单片机,本身就带PWM
0
回复
qihao
LV.4
13
2005-04-08 18:25
@清泉石上流
二进制数字频率调制(2FSK)是利用二进制数字基带信号控制载波的频率进行频谱变换的过程.在发送端,产生不同频率的载波振荡来传输数字信息“1”或“0”,在接收端,不不同频率的载波振荡还原成响应的数字基带信号.FSK有相位连续(CPFSK)和相位不连续(DPFSK)之分.    在这里所说的CPFSK,就是相位连续的频移键控调制.    现在就是计划用MCS51系列单片机来产生一路PWM信号(或者两路),不是用来做开关电源的..    请问有什么可行的办法?    我还没有做出来..    谢谢!
是不是就是调频信号:一个频率表示1,一个表示0?  
哪就是可以用常数自动装载,AT的T2可以的,这个时atmel扩展的标准51功能,以前我用来发生红外调制基波,估计能是你说的那样.记住:常数自动装载,CPU设定一次后无需再干预
不过解调呢?   测脉宽来解调?忘了当时咋做的
0
回复
qihao
LV.4
14
2005-04-08 18:31
@清泉石上流
TOqinuyy:现在我是要用MCS-5系列单片机,软件编程实现脉宽调制PWM的正弦波,然后根据串行口的高、低电平产生频移键控信号并发送,最终实现CPFSK的调制...    如你所说,我必须选择带有AD转换,PWM模块的51系列芯片,要不没有办法检测电压电流……这里我有点不懂...请指教!!!    谢谢!!!
其实搭两个方波振荡,用串口数据直接控制一个电子开关呢?发送CPU就免干预了,只要做解调工作
0
回复
grtang
LV.7
15
2005-04-08 21:54
@qiuyy
这个应该是可以做的吧.你首先要定义两个变量:一个是叫周期T,另一外一个占空比D.T的值要大于D,首先让I/O口输出高电平,让T,D同进计数,当D已经到了预计值的时候,则I/0变为低,然后低电平一直延续到T的值.当T的值到的时候,I/O口拉高.改变D,T的时间可以控制频率,改变D的值可以达到占空比的变化.这个思路很重要.这种算法要用到定时器,只要单片机时钟频率足够高,可以任意改变PWM的频率.
看来你是高手.我从来没有做个单片机电源.想请教一个问题.
有一个输出电压信号,转换成数字信号后,怎么控制占空比D?
0
回复
2005-04-08 22:03
@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的话……
    
    能说说各自的出发点所在吗?
    谢谢!
0
回复
qiuyy
LV.6
17
2005-04-09 09:55
@清泉石上流
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
回复
qiuyy
LV.6
18
2005-04-09 10:04
@grtang
看来你是高手.我从来没有做个单片机电源.想请教一个问题.有一个输出电压信号,转换成数字信号后,怎么控制占空比D?
0延迟
1读电压AD值.
2如果读到的电压在额定范围内,SJMP EXIT
3进行判断,如果大于额定电压,则PWM-DEC,否则INC
4 SJMP 0
5 EXIT
6 SJMP 0
这仅仅是一个思路.
0
回复
kangjl668
LV.4
19
2005-04-09 10:18
@qiuyy
你把要调制的数据变成表格也可以的.首先你要明白什么是PWM,好好地分析D(占空比)和T(周期)的关系.再构思一下.这个算法也是我以前想出来的.当然如果你要用程序做成正弦的话,你可以选用DA转换,这也个也不难做.
能传个程序上来看看吗?
0
回复
qiuyy
LV.6
20
2005-04-09 10:29
@kangjl668
能传个程序上来看看吗?
D=100,
T=1000;     \\duty=1/10;

INT_TIM0:
D++;
t++;
if (T=100) {P1^1=0;}
if (D=1000) {P1^1=1;
            D=0;
            T=0;}
;exit
;----end----------

用到定时器,定时器按你的频率来赋值,上述程序是一个思路,我信手写的.再不明白要打屁股了.
0
回复
grtang
LV.7
21
2005-04-09 10:42
@qiuyy
0延迟1读电压AD值.2如果读到的电压在额定范围内,SJMPEXIT3进行判断,如果大于额定电压,则PWM-DEC,否则INC4SJMP05EXIT6SJMP0这仅仅是一个思路.
对于第3步调整D值,是不是对计数器重新置数?
0
回复
qiuyy
LV.6
22
2005-04-09 10:44
@grtang
对于第3步调整D值,是不是对计数器重新置数?
try and experience it by yourslef ,pls
0
回复
grtang
LV.7
23
2005-04-09 13:04
@qiuyy
tryandexperienceitbyyourslef,pls
thank your help.
0
回复
kangjl668
LV.4
24
2005-04-09 16:35
@qiuyy
D=100,T=1000;    \\duty=1/10;INT_TIM0:D++;t++;if(T=100){P1^1=0;}if(D=1000){P1^1=1;            D=0;            T=0;};exit;----end----------用到定时器,定时器按你的频率来赋值,上述程序是一个思路,我信手写的.再不明白要打屁股了.
3ks!
0
回复
2005-04-09 23:38
@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输出后经稳压、滤波,就可得到经过调制的相位连续正弦波.
0
回复
2005-04-10 06:29
@清泉石上流
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
回复
qiuyy
LV.6
27
2005-04-10 19:58
@清泉石上流
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
回复
kexingong
LV.5
28
2005-04-10 20:26
@qihao
理论可以,不过标准51的话1us为最小指令周期-》1M,去掉中断响应:至少一个周期吧第一个长跳转:好像是3个周期?push  若干个查表(计算)若干个赋值若干个pop  XX  若干个最后中断返回:1个还是两个?如果还要求是中心对齐的PWM,能产生10K的PWM都勉强,像你说的:你有麻烦了,如果你再用C而不是汇编    ^_^  你有麻烦了.这还有分辨率的事没说呢!此路不通!  有一次逼得我就在T2中断入口后面直接写-没长跳转,节省3个周期,不过是我错了,因为是可以用常熟自动装载的.用DSP吧,不过我现在还不会.2407大约就几十K,所以现在出28XX了.数字电路的晶体频率听起来很吓人,一算下来:我有麻烦了.
用P4,大概就没问题吧?
0
回复
2005-04-10 20:49
@qiuyy
it'salsoagoodwayttoproducethePLUSOfPWM.ButtheFislimited!
limited?  How to  increase the F ? by using another one-chip ?
0
回复
2005-04-12 11:40
@清泉石上流
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能不能自动产生一系列的不规则的数字信号?应该如何实现呢??

    请指点!!!
0
回复
qiuyy
LV.6
31
2005-04-12 13:34
@清泉石上流
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
回复