专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
单片机控制pwm输出
2020-01-30 14:06
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
21828
28
28
我用单片机2个定时器控制pwm波输出,使得输出电压非常不稳定,跳动极大,这个是和频率有关还是,滤波电容有关啊,我的晶振是12M的,然后我设置40Khz,20kHz,10khz都十分不稳定,请高手帮我看看啦!!
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
28条回答
chensheng00
2020-02-01 19:23
X594008 发表于 2013-3-10 19:09
贴程序和电路图出来,这里高手多的是,肯定可以帮你解决的。
由于我是分块调试的,我只挑了单片机pwm输出部分调试,所以程序老师们只需要看定时器部分控制pwm输出就可以了。我自己也尝试了,改变单片机输出频率,达到500kz时,跳动就只有0.03v左右了,但无奈单片机输出这个频率的话就不能做任何事了,更不用说可调了,所以我还是觉得改变pwm的滤波电路最可行!请各位老师指导!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit Lcden=P3^4;
sbit RS =P3^5;
sbit RW =P3^6;
sbit duan =P2^6;
sbit wei =P2^7;
uchar code table[]="0123456789.UVIA=";
//显示读取的数处理
uchar date1,date2,date3,date4;
void DataProcessing()
{
uint temp=0x40;
date1=(temp*50*9/255)/100;
date2=(temp*50*9/255)%100/10;
date3=(temp*50*9/255)%100%10;
}
void Delay(uchar delay_ms)
{
for(delay_ms;delay_ms>0;delay_ms--)
{
uint i=120;
while(i--);
}
}
void Lcd_write_com (uchar com) //根据硬件时序图写
{
RS=0;
P0=com;
Delay(3);
Lcden=1;
Delay(2);
Lcden=0;
}
void Lcd_write_date (uchar date)
{
RS=1;
P0=date;
Delay(3);
Lcden=1;
Delay(2);
Lcden=0;
}
void Lcd_Init()
{
duan =0;
wei =0;
Lcden=0;
RS =0;
RW =0;
Lcd_write_com(0x38);//设置16x2显示,5x7点阵,8位数据接口
Delay(1);
Lcd_write_com(0x0f);//开显示,光标,光标闪烁
Delay(1);
Lcd_write_com(0x06);//读或写一个字符地址指针加一,光标加一
Delay(1);
Lcd_write_com(0x01);//显示清屏,数据指针和所有显示清零
Delay(1);
Lcd_write_com(0x80);//数据指针初始化
}
void Display()
{
Lcd_write_com(0x80+1);
Delay(1);
Lcd_write_date(table[11]);
Delay(1);
Lcd_write_com(0x80+2);
Delay(1);
Lcd_write_date(table[15]);
Delay(1);;
Lcd_write_com(0x80+3);
Delay(1);
Lcd_write_date(table[date1]);
Delay(1);
Lcd_write_com(0x80+4);
Delay(1);
Lcd_write_date(table[date2]);
Delay(1);
Lcd_write_com(0x80+5);
Delay(1);
Lcd_write_date(table[10]);
Delay(1);
Lcd_write_com(0x80+6);
Delay(2);
Lcd_write_date(table[date3]);
Delay(2);
Lcd_write_com(0x80+7);
Delay(2);
Lcd_write_date(table[12]);
Delay(2);
}
/*定时器赋初值----------------*/
unsigned char pwm_on;
sbit pwm_out=P2^4;//pwm输出端口
void TimerInit(void)
{
TMOD=0x55;//定时器0和定时器1工作于模式一
TH0=(65536-50)/256;//初值50us,pwm频率为20khz
TL0=(65536-50)%256;
TR0=1;//启动定时器0
ET0=1;//打开定时器中断
ET1=1;
EA=1;//开总中断
}
void main()
{
Lcd_Init();//LCD初始化
TimerInit();
pwm_on=20;
while(1)
{
DataProcessing ();//数据处理
Display();
}
}
//中断控制pwm
void Timer0irp (void) interrupt 1
{
TR1=0;
pwm_out=~pwm_out;
TH0=(65536-50)/256;
TL0=(65536-50)%256;//定时器0设置为50ms的周期
TH1=(65536-pwm_on)/256;
TL1=(65536-pwm_on)%256;;//由定时器1设置占空比
TR1=1;
// CLK=~CLK;
}
void Timer1irp (void) interrupt 3
{
TR1=0;
pwm_out=1;
}
加载中...
查看其它28个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
由于我是分块调试的,我只挑了单片机pwm输出部分调试,所以程序老师们只需要看定时器部分控制pwm输出就可以了。我自己也尝试了,改变单片机输出频率,达到500kz时,跳动就只有0.03v左右了,但无奈单片机输出这个频率的话就不能做任何事了,更不用说可调了,所以我还是觉得改变pwm的滤波电路最可行!请各位老师指导!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit Lcden=P3^4;
sbit RS =P3^5;
sbit RW =P3^6;
sbit duan =P2^6;
sbit wei =P2^7;
uchar code table[]="0123456789.UVIA=";
//显示读取的数处理
uchar date1,date2,date3,date4;
void DataProcessing()
{
uint temp=0x40;
date1=(temp*50*9/255)/100;
date2=(temp*50*9/255)%100/10;
date3=(temp*50*9/255)%100%10;
}
void Delay(uchar delay_ms)
{
for(delay_ms;delay_ms>0;delay_ms--)
{
uint i=120;
while(i--);
}
}
void Lcd_write_com (uchar com) //根据硬件时序图写
{
RS=0;
P0=com;
Delay(3);
Lcden=1;
Delay(2);
Lcden=0;
}
void Lcd_write_date (uchar date)
{
RS=1;
P0=date;
Delay(3);
Lcden=1;
Delay(2);
Lcden=0;
}
void Lcd_Init()
{
duan =0;
wei =0;
Lcden=0;
RS =0;
RW =0;
Lcd_write_com(0x38);//设置16x2显示,5x7点阵,8位数据接口
Delay(1);
Lcd_write_com(0x0f);//开显示,光标,光标闪烁
Delay(1);
Lcd_write_com(0x06);//读或写一个字符地址指针加一,光标加一
Delay(1);
Lcd_write_com(0x01);//显示清屏,数据指针和所有显示清零
Delay(1);
Lcd_write_com(0x80);//数据指针初始化
}
void Display()
{
Lcd_write_com(0x80+1);
Delay(1);
Lcd_write_date(table[11]);
Delay(1);
Lcd_write_com(0x80+2);
Delay(1);
Lcd_write_date(table[15]);
Delay(1);;
Lcd_write_com(0x80+3);
Delay(1);
Lcd_write_date(table[date1]);
Delay(1);
Lcd_write_com(0x80+4);
Delay(1);
Lcd_write_date(table[date2]);
Delay(1);
Lcd_write_com(0x80+5);
Delay(1);
Lcd_write_date(table[10]);
Delay(1);
Lcd_write_com(0x80+6);
Delay(2);
Lcd_write_date(table[date3]);
Delay(2);
Lcd_write_com(0x80+7);
Delay(2);
Lcd_write_date(table[12]);
Delay(2);
}
/*定时器赋初值----------------*/
unsigned char pwm_on;
sbit pwm_out=P2^4;//pwm输出端口
void TimerInit(void)
{
TMOD=0x55;//定时器0和定时器1工作于模式一
TH0=(65536-50)/256;//初值50us,pwm频率为20khz
TL0=(65536-50)%256;
TR0=1;//启动定时器0
ET0=1;//打开定时器中断
ET1=1;
EA=1;//开总中断
}
void main()
{
Lcd_Init();//LCD初始化
TimerInit();
pwm_on=20;
while(1)
{
DataProcessing ();//数据处理
Display();
}
}
//中断控制pwm
void Timer0irp (void) interrupt 1
{
TR1=0;
pwm_out=~pwm_out;
TH0=(65536-50)/256;
TL0=(65536-50)%256;//定时器0设置为50ms的周期
TH1=(65536-pwm_on)/256;
TL1=(65536-pwm_on)%256;;//由定时器1设置占空比
TR1=1;
// CLK=~CLK;
}
void Timer1irp (void) interrupt 3
{
TR1=0;
pwm_out=1;
}
一周热门 更多>