打印

DIY-频率发生器(PWM-方波)<玩具级>

[复制链接]
3863|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jrcsh|  楼主 | 2011-8-12 16:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jrcsh 于 2011-8-12 16:39 编辑

近期学习着无线电,下午看了一些调谐的资料后~~~又想动手被实践实践

打开~~5M 都没有的 20M示波器..........

但想想...... 搭了电路也没信号给过来,哪不是不知调到位了没...........(入门中了,不要叫我找电台的频率--我现在空心电感都算不出来了)

于是动手干把 ,,

频率、脉冲发生器.工作原理不外呼。。。高电平低电平~~~来来回回 就是了

/****************************************************
百科名片

频率,是单位时间内完成振动的次数,是描述振动物体往复运动频繁程度的量,常用符号f或v表示,单位为秒-1。为了纪念德国物理学家赫兹的贡献,人们把频率的单位命名为赫兹,简称“赫”。每个物体都有由它本身性质决定的与振幅无关的频率,叫做固有频率。频率概念不仅在力学、声学中应用,在电磁学和无线电技术中也常用。交变电流在单位时间内完成周期性变化的次数,叫做电流的频率。


物理学上的频率


物质在1秒内完成周期性变化的次数叫做频率,常用f表示。
物理中频率的单位是赫兹(Hz),简称赫,也常用千赫(kHz)或兆赫(MHz)或GHz做单位,单位符号为f。1kHz=1000Hz,1MHz=1000000Hz 1GHz=1000MHz。


频率f是周期T的倒数,


即f =1/T。




而像中国使用的电是一种正弦交流电,其频率是50Hz,一秒钟内做了50次周期性变化。


  另外,我们听到的声音也是一种有一定频率的声波。人耳听觉的频率范围约为20-20000HZ,超出这个范围的就不为我们人耳所察觉。
*****************************************************/

MCU手上只有STC的51............
既然是频率当然是先快点的51好了 先了 1T的10F
上次在另一个贴子测试过STC-1T-系列的51其IO反转速度最快也就  12M才下 1M 左右

注定是个玩具.........还没我用三极管搭的无稳态振荡电路快.不过这个频率有点乱飞

选了MCU就要给个窝它了................专门作块板子~~不象我的风格~~搭棚通信有点不方便.
找了块~~~最小单元板子.上边有~~~51窝棚一个,TTL转USB功能一陀,11.592M、12M 晶振 各一 (还是选用12M 的好了 好计算定时器的时间,11.0592的好纠结-<但串口通信用11.0592又是最好的~~日日日日日日日日日日>)

定义哪个IO组输出翻转信号 就P1把  P3我还要用来作串口通信

基本设想就完成了........画流程逻辑图去

直播。。。。。。。

好了开始向楼下更新了............(其实快的话~~不写这么多基本教程。。可能程序我都写完了~~~~~~~~~ 哈哈)

相关帖子

沙发
jrcsh|  楼主 | 2011-8-12 17:00 | 只看该作者


流程就这样了~~~整个程序~~~多花时间的地方反而是在于要写一个  判断按钮长按的时间处理,按得越久越加的数据值就要越快~~~难度不大~~~不用掉头发还好还好~~哈哈

使用特权

评论回复
板凳
jrcsh|  楼主 | 2011-8-12 17:02 | 只看该作者
本帖最后由 jrcsh 于 2011-8-12 17:03 编辑

这个样流程
考虑到保护IO翻转的准确性,减少等待IO翻转时有其它事件延长了翻转时间尽量的保证精度~~~


(我*~~~~一楼的文字花了我快一个小时的时间......)

使用特权

评论回复
地板
jrcsh|  楼主 | 2011-8-12 17:06 | 只看该作者
本帖最后由 jrcsh 于 2011-8-12 17:11 编辑

我又准定~~~~在加上个串口的双向通信,可以在电脑上使用串口来设置频率



/*
本程序要用到哪些功能了
定时器1 用于 发生频率的时间
定时器2用于 串行通信
中断0 用于key1 的进入
P1要进行IO翻转,传说中使用强推的方式会快点,你信不信,反正我没进行实测不知,反正开了强推也不挨事,开就是了.
*/

使用特权

评论回复
5
jrcsh|  楼主 | 2011-8-12 17:31 | 只看该作者
从另一个项目接复制过来的代码 在删删减减 无关的功能

/*
本程序要用到哪些功能了

定时器1 用于 发生频率的时间
定时器2用于 串行通信
中断0 用于key1 的进入

P1要进行IO翻转,传说中使用强推的方式会快点,你信不信,反正我没进行实测不知,反正开了强推也不挨事,开就是了.


接下来~~~找以前写的程序~~~~挖代码过来拼程序
*/



#include <REG51.H>
//#include <intrins.h>
//#include <absacc.h>

#define uint unsigned int
#define uchar unsigned char



sfr P1M1   = 0x91 ;
sfr P1M0   = 0x92 ;
     

//sbit key1=P3^2;
sbit key2=P3^6;
sbit key3=P3^7;

uint aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,lll;
uchar mmm,xxx,yyy,zzz;


uchar code commm[]={'0','1','2','3','4','5','6','7','8','9'};


void send_char(unsigned char ddat)
// 传送一个字符
{
        SBUF = ddat;
        while(!TI);                                // 等特数据传送
        TI = 0;                                        // 清除数据传送标志
}


void main()
{

   TMOD=0x21;
   TH0=0xfd;
        TL0=0xfd;
        TR0=1;
   
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
  // ES=1; //问题份子还是不开了 软处理
   EA=1;


P1M1   = 0xff ;   //P1口设置为高阻
P1M0   = 0x00 ;    //晚些在设置

while(1)
{

//===串口数据接收=========
if(RI==1)
{
ccc=SBUF;
RI=0;
}

//===串口数据接收=========

send_char('G');
send_char('W');
send_char('1');
send_char('=');
send_char(commm[ggg1/1000%10]);
send_char(commm[ggg1/100%10]);
send_char(commm[ggg1/10%10]);
send_char('.');
send_char(commm[ggg1%10]);
send_char(' ');

send_char('W');
send_char('D');
send_char('1');
send_char('=');
send_char(commm[mmm1/1000%10]);
send_char(commm[mmm1/100%10]);
send_char(commm[mmm1/10%10]);
send_char('.');
send_char(commm[mmm1%10]);
send_char(' ');

send_char('K');
send_char('1');
send_char('=');
send_char(commm[k1]);
send_char(' ');
send_char(' ');
if(ccc>0)
{
ggg1=ggg1+ccc*10;
if(ggg1>1500)
{
ggg1=800;
}
send_char('C');
send_char('O');
send_char('M');
send_char('=');

send_char(commm[ccc/100%10]);
send_char(commm[ccc/10%10]);
send_char(commm[ccc%10]);
send_char(' ');


}

SBUF=0xd;//28;       
while(!TI);       
TI=0;
SBUF=0xa;//28;       
while(!TI);       
TI=0;

  bbb=0;
aaa=0;

}// aaa=100



        } //w1
}//ma






在用代码生成器 生要

2个定时器 和中断0的设置代码


扔进去  在作些删删减减~~~ 就可以开始写功能和调试了



//timer init
void initTimer(void)
{
TMOD=0x1;
TH0=0xfe;
TL0=0xc;
}

//UART init
void initUart(void)
{
TMOD|=0x20;
SCON=0x50;
TH1=0xf3;
TL1=0xf3;
TR1=1;
}

//timer0/counter0 interrupt
void timer0(void) interrupt 1
{
TH0=0xfe;
TL0=0xc;
//add your code here.

}

//int0 interrupt
void int0(void) interrupt 0
{
IE0=0;
//add your code here


}

//the main fun
void main(void)
{
IT0=0;     //INT0低电平中断
EX0=1;     //允许INT1中断
initTimer();
initUart();
TR0=1;
ET0=1;
//EA=1;
}

使用特权

评论回复
6
jrcsh|  楼主 | 2011-8-12 17:38 | 只看该作者
跑路~~~~~~~~~~~~~~~~~~ 吃饭去

使用特权

评论回复
7
Cortex-M0| | 2011-8-13 05:15 | 只看该作者
写的不错哈~~~

支持~~~

使用特权

评论回复
8
jrcsh|  楼主 | 2011-8-17 11:25 | 只看该作者
//=== key1=====
if(key1==0)
{
ccc=1;
ddd++;
TR0=0;
do
{
;
}
while(key1==1);
}

//=== key1=====
//===========
if(ccc==1)
{
if(ddd==2)
{
ddd=0;
ccc==2;
TR0=1;
}//ddd=2 //二次进入处理

fff--;
if(fff<10)
{
fff=10;
}
hhh--;
if(hhh<fff)
{
hhh=6553;
if(key2==0)
{
eee++;
fff=fff+100;
}
if(key3==0)
{
eee--;
fff=fff+100;
}
if(fff>6300)
{
fff=6300;
}

}// hhh<fff

}// ccc=1
//===================



  处理按键长按不放的程序,安的时间越长 加减数值的速度就越快越,大该思路就是这样了,虽然还是上机调试但,感觉没什么问题。

不想长按就用作多一个串口数据接收,在按下key1后才进入工作,

使用特权

评论回复
9
jrcsh|  楼主 | 2011-8-17 11:37 | 只看该作者
看出来了 如果只是单按 + - 一个数要等一些时间才行, 这样的话又得加几行处理了

使用特权

评论回复
10
xiaotann| | 2011-8-17 11:39 | 只看该作者
固有频率

使用特权

评论回复
11
jrcsh|  楼主 | 2011-8-17 12:08 | 只看该作者
//=== key1=====
//===========
if(ccc==1)
{
if(ddd==2)
{
ddd=0;
ccc==2;
TR0=1;
}//ddd=2 //二次进入处理
//===========短按、单按响应======
if(key2==0)
{
if(fff<20)
{
eee++;
fff=fff+100;
}

}
if(key3==0)
{
if(fff<20)
{
eee--;
fff=fff+100;
}
}
//===========短按、单按响应======
fff--;
if(fff<10)
{
fff=10;
}
hhh--;
if(hhh<fff)
{
hhh=6553;
if(key2==0)
{
eee++;
fff=fff+100;
}
if(key3==0)
{
eee--;
fff=fff+100;
}
if(fff>6300)
{
fff=6300;
}

}// hhh<fff

}// ccc=1
//===================



加多了几行处理了 单按或短按的处理。这样单按一下也能立刻有响应 :victory:

使用特权

评论回复
12
Cortex-M0| | 2011-8-17 14:50 | 只看该作者
做的不错哈~~~

使用特权

评论回复
13
jrcsh|  楼主 | 2011-8-25 23:26 | 只看该作者
/*
本程序要用到哪些功能了

定时器1 用于 发生频率的时间
定时器2用于 串行通信
中断0 用于key1 的进入

P1要进行IO翻转,传说中使用强推的方式会快点,你信不信,反正我没进行实测不知,反正开了强推也不挨事,开就是了.


接下来~~~找以前写的程序~~~~挖代码过来拼程序


20110817
中断0没有启用,普通IO查询可以满足.
完善按键处理程序
定时器0送入数据处理

下一计划完成手动设置及串口显示状态可工作后在加入通过串口进行数据设置



20110825
下午发呆...又操了操...
加速上数工作了
数据写到定时器有BUG 排除之



key1  //进入设置  和退出设置
key2  //++
key3  //--
key4  // 选设置数的位置
*/



#include <REG51.H>
//#include <intrins.h>
//#include <absacc.h>

#define uint unsigned int
#define uchar unsigned char



sfr P1M1   = 0x91 ;
sfr P1M0   = 0x92 ;
     
sbit d2=P2^1;
sbit d1=P2^0;
sbit key1=P3^2;
sbit key2=P3^6;
sbit key3=P3^7;
sbit key4=P3^5;

uint mmm,ccc,ddd,eee,fff,ggg,hhh,iii,lll,ppp,ppp2,eee2;
uchar xxx,yyy,zzz,aaa,bbb,qq123;


uchar code commm[]={'0','1','2','3','4','5','6','7','8','9'};
/*


void delayms(uint z)  //ms
{                                       
        uint x,y;
        for(x=z;x>0;x--)
                for(y=100;y>0;y--);       
}

*/

void send_char(unsigned char ddat)
// 传送一个字符
{
        SBUF = ddat;
        while(!TI);                                // 等特数据传送
        TI = 0;                                        // 清除数据传送标志
}


//timer0/counter0 interrupt
void timer0(void) interrupt 1
{
P1=~P1;
TL0=aaa;
TH0=bbb;
TR0=1; //管你有没关了开了在说

}

//int0 interrupt

void main()
{

TMOD=0x21;
TH0=255;
TL0=255;
TR0=1;
ET0=1;
SCON=0x50;
TH1=0xf3;
TL1=0xf3;
TR1=1;

EA=1;

P1M1   = 0x00 ;   //P1口设置为强推
P1M0   = 0xff ;    //晚些在设置
aaa=128;
bbb=128;
ccc=2;
ddd=0;
fff=6553;
eee=1;
ppp=30000;
ccc=0;//调试
P1=0xff;
d1=1;
d2=1;
while(1)
{

//=== key1=====
if(key1==0)
{
ccc=1;
ddd++;
//TR0=0; //关闭定时器0
//TR1=1;//打开串口通信波特发生
d1=0;
while(key1==0)
{
;
}
mmm=1;
d1=1;
}


//=== key1=====
//===========
if(ccc==1)
{
d2=0;
if(ddd==2)
{
d2=1;
ddd=0; //进入次数记录
ccc=2; // 退出CCC

aaa=(65535-eee)%256;
bbb=(65535-eee)/256;

TL0=aaa;
TH0=bbb;
//TR0=1; //打开定时器0
//TR1=0;//关闭串口通信波特发生


//bbb=TH0=(65535-50000)/256;
//aaa= TL0=(65535-50000)%256;
mmm=1;
}//ddd=2 //二次进入处理
//===========短按、单按响应======



if(fff==1)
{
eee=1;
}
if(fff==2)
{
eee=10;
}
if(fff==3)
{
eee=100;
}
if(fff==4)
{
eee=1000;
}
if(fff==5)
{
eee=10000;
}


if(key4==0)
{
fff++;
mmm=1;
while(key4==0)
{
;
}
}
if(fff>5)
{
fff=1;
}
//==============


if(key2==0)
{
ppp=ppp+eee;
mmm=1;
while(key2==0)
{
;
}
}

if(key3==0)
{
ppp=ppp-eee;
mmm=1;
while(key3==0)
{
;
}
}
if(ppp>65535)
{
ppp=1;
}
if(ppp<1)
{
ppp=65535;
}
//=============数据输出
if(mmm==1)
{
mmm=65530;
eee=1000000/ppp;
bbb=(65535-eee)/256;
aaa=(65535-eee)%256;
TL0=aaa;
TH0=bbb;

send_char('P');
send_char('1');
send_char('=');
ppp2=ppp/2;
send_char(commm[ppp2/100000%10]);
send_char(commm[ppp2/10000%10]);
send_char(commm[ppp2/1000%10]);
send_char(' ');
send_char(commm[ppp2/100%10]);
send_char(commm[ppp2/10%10]);
send_char(commm[ppp2%10]);
send_char('H');
send_char('z');
send_char(' ');

send_char('E');
send_char('=');
send_char(commm[eee/10000%10]);
send_char(commm[eee/1000%10]);
send_char(' ');
send_char(commm[eee/100%10]);
send_char(commm[eee/10%10]);
send_char(commm[eee%10]);
send_char('u');
send_char('S');
send_char(' ');


send_char(' ');
send_char('H');
send_char('=');
send_char(commm[bbb/100%10]);
send_char(commm[bbb/10%10]);
send_char(commm[bbb%10]);

send_char(' ');
send_char('L');
send_char('=');
send_char(commm[aaa/100%10]);
send_char(commm[aaa/10%10]);
send_char(commm[aaa%10]);
send_char(' ');
send_char(' ');
send_char(commm[fff]);


qq123++;
if(qq123>7)
{
qq123=1;
send_char(' ');
send_char(' ');
send_char('<');
send_char('>');
}

SBUF=0xd;//28;       
while(!TI);       
TI=0;
SBUF=0xa;//28;       
while(!TI);       
TI=0;
send_char(' ');
SBUF=0xd;//28;       
while(!TI);       
TI=0;
SBUF=0xa;//28;       
while(!TI);       
TI=0;
}

//mmm--;
//=============数据输出
}// ccc=1
//===================





        } //w1
}//ma


由于加速上数的处理没达到想要的效果就

把加速上数的程序去除了 换上 选数位进行设置的按键处理程序

偏差还是挺大的, 频率越快越大 ........也就个玩具了

使用特权

评论回复
14
jrcsh|  楼主 | 2011-8-25 23:41 | 只看该作者
设计输出频率范围是 15Hz~32KHz

使用特权

评论回复
15
lisijun100| | 2011-8-25 23:53 | 只看该作者
学习楼主执着的精神

使用特权

评论回复
16
jrcsh|  楼主 | 2011-8-26 03:11 | 只看该作者
本帖最后由 jrcsh 于 2011-8-26 03:13 编辑

测试录象通过审核了~~~~


http://v.youku.com/v_show/id_XMjk4Mzk0MDc2.html







.

使用特权

评论回复
17
Cortex-M0| | 2011-8-26 06:50 | 只看该作者
支持LZ~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:以上以下纯属瞎扯,概不承认!!!!! 感谢  应试教育 培养了我的基础    感谢自己  没吧应试教作为各种借口

228

主题

2350

帖子

18

粉丝