最新日志

发表于:2008-7-2 14:59:39
标签:自己创建  万利STM32  IAR工程  

15

自己动手创建一个基于万利STM32板的IAR工程

    圈圈前面几个STM32的程序是直接拿例子来改的,但
我们总不能每次都拿别人的例子来改吧?我们要学会如何
自己来创建一个属于自己的IAR工程。

    首先启动IAR开发环境。如果你的设置是在启动时出现
Embedded Workbench Startup对话框,那么可以直接
在这个对话框中点击第一个按钮——Create new project
in current workspace。如果你选择了启动不出现这个对话
框,那么你可以在IAR的菜单栏中找到Project菜单,在其子
菜单中有一个“Create new project...”。点击之后会出现
创建新工程的对话框,Tool chain选择ARM,Project templates
我们选择Empty project,然后点击OK。这时会弹出保存工程
的对话框,随便些个工程名,例如MyTestProject,点击保存。
这时一个空的工程就创建好了,接下来我们对工程的选项进行
设置。

    在Workspace窗口中,右击MyTestProject,在弹出的菜
单中选择Options,这时就打开了工程选项。在第一项General
Options中,选择Target标签页。在Processor variant分组中
单击Device单选按钮,然后单击Device右边的器件选择按钮,
在弹出的菜单中选择ST菜单中的ST STM32F10x。Endian mode
选择为Little,即小端模式。Stack align选择为4字节。
Output标签页使用默认设置就可以了,不用动。Library
Configuration标签页中的Library选择为Full。Library options
和MISRA C标签页不用动,使用默认即可。

    再切换到C/C++ Compiler分类,选择Language标签页,
Language我们选择为C,并将Require prototypes勾上,
在Language conformace分组中选择Relaxed ISO/ANSI。其他
几个标签页可以不用修改。

    然后再切换到Linker分类,在Output标签页中,在Format
分组中将Allow C-SPY-specific extra的复选框勾上。再切换
到Extra Output标签页,将Generate extra output file勾上。
再切换到Config标签页,在Linker command file分组中将
Override default勾上,这时有个默认的lnkarm.xcl文件,它
位于IAR的安装目录\IAR Systems\Embedded Workbench 4.0
Kickstart\arm\config下。点击旁边的浏览文件的按钮,找到
这个默认的lnkarm.xcl文件,然后复制一份到我们的工程目录
MyTestProject下。然后在Override default下面的框中写入
路径$PROJ_DIR$\lnkarm.xcl,这将使用我们工程目录下的链
接文件。但是这个链接文件还是不行的,需要做一下修改。
用记事本打开我们刚刚复制到工程目录下的lnkarm.xcl文件,
找到以下部分并修改(其中用//注释的是原来的):
//-DROMSTART=08000
//-DROMEND=FFFFF
-DROMSTART=0x8000000
-DROMEND=0x801FFFF
//-DRAMSTART=100000
//-DRAMEND=7FFFFF
-DRAMSTART=0x20000000
-DRAMEND=0x20004FFF
//-Z(CODE)INTVEC=00-3F
-Z(CODE)INTVEC=ROMSTART-ROMEND
//-D_CSTACK_SIZE=2000
-D_CSTACK_SIZE=800
//-D_HEAP_SIZE=8000
-D_HEAP_SIZE=400

    再切换到Debugger分类,在Setup标签页中,Driver选择
Third-Party Driver。在Download标签页中,将Use flash
loader勾上。

    然后在切换到最下面的Third-Party Driver分类,以选择
调试器的驱动。在IAR debugger driver下的文本框中输入驱动
的路径,一般是C:\Manley\drivers\STLink\STM32Driver.dll,
这要看你的STLink驱动装在哪了,指定到安装的路径即可。

    至此,我们的工程选项就设置完了。接下来我们写个流水
灯的程序。要控制LED亮,就需要将对应的IO口设置为输出口,
并控制IO口的输出电平。通过查看万利STM32板的原理图,我们
4个LED是分别接在PORTC的4、5、6、7这4个引脚上的,高电平
时将点亮LED。

    首先我们要将IO口设置为输出模式,查看STM32F103的数据
手册,是通过GPIOx_CRL和GPIOx_CRH寄存器来选择模式的。
我们要设置PORTC口的4、5、6、7位,那么就应该使用GPIOC_CRL
寄存器,它的地址为0x40011000。我们将这4个IO口设置为50MHz
的推挽输出模式,具体的代码见后面。然后,我们就可以对IO
口的高低电平进行控制了,这通过端口置1和清0寄存器来控制,
即寄存器GPIOx_BSRR寄存器和GPIOx_BRR寄存器。GPIOx_BSRR
寄存器可以同时置1和清0,高16位是用来清0的,低16位是用来
置1的。如果置1和清0位被同时设置,那么置1的优先级高。
由于我们这里是控制LED的,对操作要求不严格,所以我们不
使用BSRR寄存器的高16位,而用GPIOx_BRR寄存器来清0。
GPIOC_BSRR和GPIOC_BRR的地址分别为0x40011010和0x40011014。
另外,我们还需要启动PORTC的时钟,才能让端口工作起来。
启动PORTC时钟的控制在RCC_APB2ENR寄存器中,其中Bit4控制
PROTC的时钟,该位为1时时钟使能。RCC_APB2ENR的地址为
0x4002 1018。

    最终,我们写出的流水灯程序入下所示。点击创建新文本
文件的图标,建立一个新的源文件。然后将以下代码复制进去:

#define GPIOC_CRL   (*((unsigned int *)(0x40011000)))
#define GPIOC_BSRR  (*((unsigned int *)(0x40011010)))
#define GPIOC_BRR   (*((unsigned int *)(0x40011014)))
#define RCC_APB2ENR (*((unsigned int *)(0x40021018)))

void Delay(void)//延时函数,流水灯显示用
{
 unsigned int i;
 for(i=0;i<0xFFFFF;i++);
}

void main(void)
{
 //使能PORTC时钟
 RCC_APB2ENR |=(1<<4);
 //将GPIOC_CRL高16位都清0
 //这样CNF为00,即选择为推挽输出模式
 GPIOC_CRL &= 0x0000FFFF;
 //MODE选择为11,即50MHz输出模式
 GPIOC_CRL |= 0x33330000;
 
 while(1)
 {
  GPIOC_BRR=(1<<4); //灭 LED5
  GPIOC_BSRR=(1<<7);//亮 LED2
  Delay();
  GPIOC_BRR=(1<<7); //灭 LED2
  GPIOC_BSRR=(1<<6);//亮 LED3
  Delay();
  GPIOC_BRR=(1<<6); //灭 LED3
  GPIOC_BSRR=(1<<5);//亮 LED4
  Delay();
  GPIOC_BRR=(1<<5); //灭 LED4 
  GPIOC_BSRR=(1<<4);//亮 LED5
  Delay();
 }
}

   然后将其保存为main.c文件。再在Workspace窗口中,
右击MyTestProject,在弹出的菜单中选择“Add”→“Add
Files...”,然后将我们刚刚保存的main.c文件增加进去。
然后编译,点击开始调试,等下载完成后,全速运行,就
可以看到流水灯跑起来了~~~~~

   如果你需要产生一个HEX文件然后通过ISP下载来运行,
那么还需要在我们刚刚的lnkarm.xcl文件最后加入一行:
-Ointel-extended,(CODE)=.hex
这样就会在工程目录的Debug\Exe下产生一个HEX文件。
当然,具体是在Debug目录还是Release目录,就要看你
当前选择编译模式了。

   当然,上面这个工程只是一个非常简单的例子,在实际
的工程中,我们还有更多、更复杂的事情要做,例如各种
时钟的初始化、中断初始化等等。这些就需要靠大家自己
去看资料学习了,圈圈也只能是爱莫能助。ST提供的库包
含了很多已经写好了的代码,大家可以直接使用,以减少
编程的工作量。

     看完了?记得给圈圈顶一下~~~就在左上角那里~~~点一

下那个“顶一下”按钮~~~谢谢。

 

 

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(4) | 阅读(317)
发表于:2008-6-18 12:42:35
标签:万利  STM32板  快速上手  

25

[原创]万利STM32板快速上手

对于出厂的万利STM32板,里面已经下载了一个演示程序,
我们直接上电就可以运行它了。需要注意的是板上有两个
USB口,左边(串口朝上)的一个是ST-LINK的,右边的是
STM32的USB口。通过CN2来选择谁供电,CN2在ST-LINK的
USB口旁边。通常我们调试时将CN2连接到ST-LINK,这样
板子就可以通过ST-LINK供电了。如果是非调试运行带USB
的程序,则将CN2连接到USB端,这样可以通过USB口供电。
程序运行后,你可以按动各个开关,看看板子的具体反映。
可以设置为显示ADC的值,这时转动那个兰色的电位器VR1
可改变电压值。

靠近LCD的两个黄色的跳线冒JP3和JP4四控制BOOT1和BOOT0
的。我们通常选择用FLASH启动,设置JP4为0,JP3不用管。
如果要从内部SRAM启动,则设置为JP3→1,JP4→1。如果要
通过串口进行ISP,则设置为JP3→0,JP4→1。

好了,运行了一下测试程序,爽了一把之后,我们就要自己
来写程序了。首先我们要安装开发环境IAR。打开光盘中的
IAR EWARM,解压CD-EWARM-KS-442A.zip,然后进入,运行
autorun.exe,选择Install IAR Embedded Workbench安装
开发环境,在出现的欢迎界面中,还是选择Install IAR
Embedded Workbench,然后按照提示,一步步安装即可。

对于ST-LINK,如果没有安装驱动程序的话,在IAR中是找不
到的,所以我们需要安装ST-LINK的驱动。在未安装驱动之
前,连接上ST-LINK,会在我的电脑中增加一个移动磁盘,
里面有一些文件。这个U盘是只读的,不能写。如果你看到了
磁盘,请不要怀疑你插错了USB口,ST-LINK的确会增加一个
磁盘设备的,并且安装驱动以及以后的调试过程中,它依然
还是存在的。安装驱动,就是进入EWARM_Driver,运行
installSTLink.exe即可。

然后,我们再来安装开发板提供的例子。进入EK BOARD\EKSTM32F
目录,运行EKSTM32F_examples.exe,选择合适的目录,安装之。

然后我们启动IAR,从刚刚安装的例子中打开一个工程,例如
Manley\EKBoard\EKSTM32F\LCDDemo(lcd+led+buttom)\LCDDemo\
project\EWARM\LCDDemo.eww,然后我们点击编译,再点击debug,
就会出现一个下载和编程FLASH的对话框,下载完成后,再点击
Go,就可以全速运行了,这时我们可以看到LCD上显示的字。按下
KEY2可以让LED亮,按下KEY3可以让LED灭。点击Stop Debugging
按钮,停止调试。

接下来我们就在这个程序的基础上,增加一个流水灯的功能。
LED是连接在PORTC4、5、6、7上的。使用LED之前应该先初始化这些
IO口,不过我们所打开的例子已经有初始化代码了,所以我们不用
写。直接在主循环中增加控制LED的代码即可。我们直接调用库函数
实现LED的控制:GPIO_SetBits和GPIO_ResetBits两个函数。高电平
时LED亮,使用GPIO_SetBits设置相应的位即可。

打开main.c,然后找到main函数,在while(1){下面增加如下代码:

    static u32 i="1";
    switch(i)
    {
      case 1:
        GPIO_ResetBits(GPIOC, GPIO_Pin_4); //关LED5
        GPIO_SetBits(GPIOC, GPIO_Pin_7);  //开LED2
      break;
      case 2:
        GPIO_ResetBits(GPIOC, GPIO_Pin_7); //关LED2
        GPIO_SetBits(GPIOC, GPIO_Pin_6); //开LED3
      break;
       case 3:
        GPIO_ResetBits(GPIOC, GPIO_Pin_6); //关LED3
        GPIO_SetBits(GPIOC, GPIO_Pin_5); //开LED4
      break;
       case 4:
        GPIO_ResetBits(GPIOC, GPIO_Pin_5); //关LED4
        GPIO_SetBits(GPIOC, GPIO_Pin_4);  //开LED5
        i="0";
      break;
      default :
        i="0";
      break;
    }
    i++; //切换到下一个灯

然后重新编译,调试,就可以看到我们的流水灯走起来了,
每个灯亮的时间大概在1秒左右。你可以按照自己的想法,
来玩更多的花样~~~圈圈在这里就不罗嗦了。

另外,还有ADC、串口、USB的例子等,大家都可以跑一跑,
然后自己来改一改程序。下面这两个是圈圈拿USB摇杆那个
例子改的USB MIDI键盘和USB HID设备,供大家学习参考。
http://blog.ednchina.com/computer00/123111/message.aspx
http://blog.ednchina.com/computer00/123115/message.aspx

 

看了之后记得点一下左上角的“顶一下”,支持一下圈圈,

给圈圈投一票,谢谢了!

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(10) | 阅读(984)
发表于:2008-6-6 0:40:10
标签:万利  STM32板  实现  自定义  USB  HID设备  

22

万利的STM32板实现的自定义USB HID设备

     大家知道,将一个USB设备定义为用户自定义的HID设备,就

可以让windows操作系统识别为一个HID兼容设备,并不需要用

户自己提供驱动程序,应用程序可以直接通过操作系统提供的

HID驱动来访问设备,这个特性是很方便的。当一个USB HID

设备被识别后,会在设备管理器里的“人体学输入设备”中增

加一个“USB 人体学输入设备”,如果它是一个用户自定义的

HID设备,还会在这里增加一个“HID-compliant device”的设

备。在驱动程序的层次,后者是在前者之上的。当设备返回数

据时,首先到达“USB 人体学输入设备”,并且缓冲起来,可

以缓冲多个数据包。如果这时应用软件从“HID-compliant

device”请求数据,则“HID-compliant device”会从“USB

人体学输入设备”请求数据,如果没有定义用途ID的话,

则还会自动在前面加上一个字节0作为用途ID。发送数据时

这个过程刚好相反。例如在我们这个例子中,应用程序每次读

取数据,将获得65字节的数据,第一字节是用途ID,为0。

后面的才是我们的设备返回的64字节数据。同样,发送数据

时,要发送65字节,第一字节为用途ID,实际发送到USB设备

的数据是64字节。这个过程我们在BUS HOUND上也可以看到,

并且也可以看到“HID-compliant device”是位于“USB 人体学

输入设备”之下的。

     下面这个程序就是圈圈在万利的STM32板上实现的自定义

HID设备。它使用了端点1的输入和输出,作为中断端点,端点

大小为64字节。这个仅是一个示例,它仅是简单的接收数据并

保存在OutBuffer中。当摇动摇杆时,就发送64字节一样的数据

到PC。具体的应用可由用户自己来决定。下载下面这个压缩

包,解压到Manley\EKBoard\EKSTM32F\USBDemo(8M osc)

\USBDemo\USBLib\demos目录下,然后编译,烧写调试即可。

下载本实验源代码包:点击下载

     下面这个压缩包是一个测试程序,可以用来测试HID设备。

填好VID和PID之后,再点击“find my device”,然后点

“once”,就会发送数据出去,同时试图读回数据。

这时摇动开发板上的摇杆,就会返回数据。每按一次,数据增加1。

下载测试程序:点击下载

本测试程序的源代码可从这里下载:http://group.ednchina.com/93/8769.aspx

 

看了之后记得点一下左上角的“顶一下”,支持一下圈圈,

给圈圈投一票,谢谢了!

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(4) | 阅读(676)
发表于:2008-6-5 23:55:14
标签:万利  STM32板  USB  MIDI键盘  

20

万利的STM32板实现的USB MIDI键盘

我是拿原来的USB摇杆的那个程序来改的,所以里面还有很多

原来的摇杆方面的东东,懒得去改它了,能用就行了。

源代码包下载:
地址1:点击下载

地址2:http://bbs.21ic.com/upfiles/img/20076/20076221556505.rar


下载后将其解压缩到万利的USB DEMO路径下,即:
Manley\EKBoard\EKSTM32F\USBDemo(8M osc)\USBDemo\USBLib\demos\

然后编译,烧入,插上USB口就可以发现新硬件了,是一个

USB AUDIO设备。

然后就可以使用一些支持MIDI接口的软件来弹琴了~~~不过这

个板子上的开关太少了,我就用了那个摇杆的,4个方向有

4个音。中间那个压是播放里面存储的一个歌,进入播放后,

再动一下那个摇杆就会退出播放了。



这个是我以前在HappyEO下录的自动弹奏的曲子:
下载地址1:

1.rar   rar      2.rar  rar       3.rar rar

下载地址2:http://computer00.21ic.org/uploadfile-/2007-12/1215456159.rar

这个是HappyEO电子琴小软件:

下载地址1:

1.rar rar       2.rar rar        3.rar rar

下载地址2:http://computer00.21ic.org/uploadfile-/2007-12/1215291213.rar

打开HappyEO电子琴(或者其它类似能够接收MIDI输入的软

件),点击HappyEO面板上的Option按钮,在弹出的对话框

中,单击MIDI输入标签,然后将“用MIDI输入设备”勾上,

在下面的“使用下列MIDI输入设备:”列表框中选中“USB

 Audio Device”,然后单击确定。这时再按STM32板上的按

键,电脑应该能发声。如果不能发声,检查音量是否打开。

双击任务栏右下角的小喇叭,里边有个“MIDI Synth”,

这个是控制MIDI合成音量的。最左边那个总音量。按下摇杆

中键,就会自动弹奏内置的一首曲子。

在HappyEO面板的右半部分可以选择不同的乐器,右击一个数

字,在弹出的框中可以选择具体的乐器。只放了一个测试的歌

在里面,大家可以根据我的格式,自己放自己喜欢的歌进去^_^。

 

看了之后记得点一下左上角的“顶一下”,给圈圈投一票,谢谢了!

 


 

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(5) | 阅读(817)
发表于:2008-5-26 2:16:26
标签:  

9

评论(8) | 阅读(738)
发表于:2008-5-21 16:02:09
标签:END  51  学习板  测试程序  

119

[原创]END 51学习板测试程序

    彩云送了一套EDN 51的套件给圈圈,叫圈圈赶紧帮忙测试下...圈圈拿到板子后,马不停蹄的安装、写测试程序...经过3、4天的奋斗之后,终于完成了板子上大部分功能的测试。由于52的ROM有限,红外接收头和PS2的就没做测试了,并且这两个功能用的人也较少。

    其中包括串口驱动、LCD1602驱动、键盘驱动、ADC0832驱动、温度传感器DS18B20驱动、实时时钟DS1302驱动、EEPROM24C08驱动、时钟调整功能、闹钟设置功能、温度报警功能等等。

    使用方法:串口波特率为57600,可以显示当前信息,例如ADC,时间,温度,按键动作等等。

    我对键盘重新进行了编号:上面一排从左到右依次为KEY1~KEY4,下面一排从左到右依次为KEY5~KEY7。KEY1键为查看ADC显示键,KEY2为查看时钟显示键,KEY3为查看温度显示键,KEY4为设置时钟键,KEY5为移动调节位键,KEY6为减1键,KEY7为加1键,KEY8为设置闹钟和报警温度键。

    另外,原本板子上标的个别参数有误,例如LCD的对比度调节电阻R29标的为10K应该改成1K的,否则LCD看不到显示。另外,LCD和数码管不能同时显示,否则LCD无法输出低电平,查忙信号通不过,这时要将控制数码管的跳线S9拔掉。测试数码管时,拔下LCD,将config.h中的LCD宏定义删除。S7、S8跳线要跳到DS1302芯片上,如果时钟显示不对,可能是因为晶体没启振的原因,可以将32.768K晶体上的两个电容C11和C13断开再试试。另外,我将给板子做后备电源的S10换成了一个22uF的钽电解电容,这样可以在板子短时间断电后始终继续走。而板子上的可调电压输出可以通过S4接到ADC0上。至于ADC1,如果不用的话,可以用跳线将起接地,悬空的话,可能测到的结果就不是0V了。

    由于时间比较仓促,难免会有bug,希望大家发现后提出来。本程序仅供参考使用,希望对大家有帮助。

源代码包下载(密码请打开看里面的解压说明):

下载地址1:EDN51TestBoard.rar

下载地址2:点击下载

      如果您觉得这个程序包不错的话,请支持一下呀,点一下左上角的“顶一下”按钮就行了~~~不然圈圈看到顶的人不多,下次就没心情写程序包了~~~~这可是几天奋斗的结晶~~~

     本程序包对应的硬件电路图和PCB、套件申请购买等,请看EDN 51小组:

http://group.ednchina.com/304/

 

点击此处查看原文 >>

系统分类: 测试测量   |    用户分类:    |    来源: 原创

评论(28) | 阅读(2208)
发表于:2008-5-16 0:09:35
标签:数字示波器  方框图  

84

[资料]数字示波器的方框图、XJ4241模拟示波器原理图

这个是主要以ADI公司的芯片的一款数字示波器方框图。大家可以参考一下,也可以让我们知道哪些部分可以使用怎样的芯片。图中所标的芯片型号,大家可以去ADI公司的网站上下在数据手册。

PDF版本下载:rar

点击看大图

 

XJ4241模拟示波器原理图:点击下载

 

 

点击此处查看原文 >>

系统分类: 测试测量   |    用户分类:    |    来源: 原创

评论(0) | 阅读(963)
发表于:2008-5-15 3:01:03
标签:FFT结果  物理意义  

122

[原创]FFT结果的物理意义

    FFT是离散傅立叶变换的快速算法,可以将一个信号变换
到频域。有些信号在时域上是很难看出什么特征的,但是如
果变换到频域之后,就很容易看出特征了。这就是很多信号
分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱
提取出来,这在频谱分析方面也是经常用的。

    虽然很多人都知道FFT是什么,可以用来做什么,怎么去
做,但是却不知道FFT之后的结果是什意思、如何决定要使用
多少点来做FFT。

    现在圈圈就根据实际经验来说说FFT结果的具体物理意义。
一个模拟信号,经过ADC采样之后,就变成了数字信号。采样
定理告诉我们,采样频率要大于信号频率的两倍,这些我就
不在此罗嗦了。

    采样得到的数字信号,就可以做FFT变换了。N个采样点,
经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT
运算,通常N取2的整数次方。

    假设采样频率为Fs,信号频率F,采样点数为N。那么FFT
之后结果就是一个为N点的复数。每一个点就对应着一个频率
点。这个点的模值,就是该频率值下的幅度特性。具体跟原始
信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT
的结果的每个点(除了第一个点直流分量之外)的模值就是A
的N/2倍。而第一个点就是直流分量,它的模值就是直流分量
的N倍。而每个点的相位呢,就是在该频率下的信号的相位。
第一个点表示直流分量(即0Hz),而最后一个点N的再下一个
点(实际上这个点是不存在的,这里是假设的第N+1个点,也
可以看做是将第一个点分做两半分,另一半移到最后)则表示
采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率
依次增加。例如某点n所表示的频率为:Fn=(n-1)*Fs/N。
由上面的公式可以看出,Fn所能分辨到频率为为Fs/N,如果
采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。
1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒
时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时
间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率
分辨力,则必须增加采样点数,也即采样时间。频率分辨率和
采样时间是倒数关系。
  假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是
An=根号a*a+b*b,相位就是Pn=atan2(b,a)。根据以上的结果,
就可以计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:
An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。
对于n=1点的信号,是直流分量,幅度即为A1/N。
    由于FFT结果的对称性,通常我们只使用前半部分的结果,
即小于采样频率一半的结果。

    好了,说了半天,看着公式也晕,下面圈圈以一个实际的
信号来做说明。

    假设我们有一个信号,它含有2V的直流分量,频率为50Hz、
相位为-30度、幅度为3V的交流信号,以及一个频率为75Hz、
相位为90度、幅度为1.5V的交流信号。用数学表达式就是如下:

S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)

    式中cos参数为弧度,所以-30度和90度要分别换算成弧度。
我们以256Hz的采样率对这个信号进行采样,总共采样256点。
按照我们上面的分析,Fn=(n-1)*Fs/N,我们可以知道,每两个
点之间的间距就是1Hz,第n个点的频率就是n-1。我们的信号
有3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、
第76个点上出现峰值,其它各点应该接近0。实际情况如何呢?
我们来看看FFT的结果的模值如图所示。

                      图1 FFT结果
    从图中我们可以看到,在第1点、第51点、和第76点附近有
比较大的值。我们分别将这三个点附近的数据拿上来细看:
1点: 512+0i
2点: -2.6195E-14 - 1.4162E-13i 
3点: -2.8586E-14 - 1.1898E-13i

50点:-6.2076E-13 - 2.1713E-12i
51点:332.55 - 192i
52点:-1.6707E-12 - 1.5241E-12i

75点:-2.2199E-13 -1.0076E-12i
76点:3.4315E-12 + 192i
77点:-3.0263E-14 +7.5609E-13i
  
    很明显,1点、51点、76点的值都比较大,它附近的点值
都很小,可以认为是0,即在那些频率点上的信号幅度为0。
接着,我们来计算各点的幅度值。分别计算这三个点的模值,
结果如下:
1点: 512
51点:384
76点:192
    按照公式,可以计算出直流分量为:512/N=512/256=2;
50Hz信号的幅度为:384/(N/2)=384/(256/2)=3;75Hz信号的
幅度为192/(N/2)=192/(256/2)=1.5。可见,从频谱分析出来
的幅度是正确的。
    然后再来计算相位信息。直流信号没有相位可言,不用管
它。先计算50Hz信号的相位,atan2(-192, 332.55)=-0.5236,
结果是弧度,换算为角度就是180*(-0.5236)/pi=-30.0001。再
计算75Hz信号的相位,atan2(192, 3.4315E-12)=1.5708弧度,
换算成角度就是180*1.5708/pi=90.0002。可见,相位也是对的。
根据FFT结果以及上面的分析计算,我们就可以写出信号的表达
式了,它就是我们开始提供的信号。

    总结:假设采样频率为Fs,采样点数为N,做FFT之后,某
一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值
除以N/2就是对应该频率下的信号的幅度(对于直流信号是除以
N);该点的相位即是对应该频率下的信号的相位。相位的计算
可用函数atan2(b,a)计算。atan2(b,a)是求坐标为(a,b)点的角
度值,范围从-pi到pi。要精确到xHz,则需要采样长度为1/x秒
的信号,并做FFT。要提高频率分辨率,就需要增加采样点数,
这在一些实际的应用中是不现实的,需要在较短的时间内完成
分析。解决这个问题的方法有频率细分法,比较简单的方法是
采样比较短时间的信号,然后在后面补充一定数量的0,使其长度
达到需要的点数,再做FFT,这在一定程度上能够提高频率分辨力。
具体的频率细分法可参考相关文献。

[附录:本测试数据使用的matlab程序]
close all; %先关闭所有图片
Adc=2;  %直流分量幅度
A1=3;   %频率F1信号的幅度
A2=1.5; %频率F2信号的幅度
F1=50;  %信号1频率(Hz)
F2=75;  %信号2频率(Hz)
Fs=256; %采样频率(Hz)
P1=-30; %信号1相位(度)
P2=90;  %信号相位(度)
N=256;  %采样点数
t=[0:1/Fs:N/Fs]; %采样时刻

%信号
S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180);
%显示原始信号
plot(S);
title('原始信号');

figure;
Y = fft(S,N); %做FFT变换
Ayy = (abs(Y)); %取模
plot(Ayy(1:N)); %显示原始的FFT模值结果
title('FFT 模值');

figure;
Ayy=Ayy/(N/2);   %换算成实际的幅度
Ayy(1)=Ayy(1)/2;
F=([1:N]-1)*Fs/N; %换算成实际的频率值
plot(F(1:N/2),Ayy(1:N/2));   %显示换算后的FFT模值结果
title('幅度-频率曲线图');

figure;
Pyy=[1:N/2];
for i="1:N/2"
 Pyy(i)=phase(Y(i)); %计算相位
 Pyy(i)=Pyy(i)*180/pi; %换算为角度
end;
plot(F(1:N/2),Pyy(1:N/2));   %显示相位图
title('相位-频率曲线图');

    本文是圈圈参加END博客大赛的文章,希望大家支持一下
圈圈,点一下左上角那个“顶一下”,给圈圈投一票,谢谢了。

                          (By  computer00   @2008-05-15)

点击此处查看原文 >>

系统分类: 测试测量   |    用户分类:    |    来源: 原创

评论(19) | 阅读(2488)
发表于:2008-5-13 21:53:21
标签:示波器探头  使用  注意事项  

110

[原创]示波器探头的使用注意事项

    别看一个示波器探头很简单,其实还是很有讲究的。以下是
圈圈使用示波器探头的一点小经验,供大家使用时参考一下。

    首先是带宽,这个通常会在探头上写明,多少MHz。如果探头
的带宽不够,示波器的带宽再高也是无用,瓶颈效应。

    另外就是探头的阻抗匹配。探头在使用之前应该先对其阻抗
匹配部分进行调节。通常在探头的靠近示波器一端有一个可调电
容,有一些探头在靠近探针一端也具有可调电容。它们是用来调
节示波器探头的阻抗匹配的。如果阻抗不匹配的话,测量到的波
形将会变形。调节示波器探头阻抗匹配的方法如下:首先将示波
器的输入选择打在GND上,然后调节Y轴位移旋钮使扫描线出现在
示波器的中间。检查这时的扫描线是否水平(即是否跟示波器的
水平中线重合),如果不是,则需要调节水平平衡旋钮(通常模
拟示波器有这个调节端子,在小孔中,需要用螺丝刀伸进去调节。
数字示波器不用调节)。然后,再将示波器的输入选择打到直流
耦合上,并将示波器探头接在示波器的测试信号输出端上(一般
示波器都带有这输出端子,通常是1KHz的方波信号),然后调节
扫描时间旋钮,使波形能够显示2个周期左右。调节Y轴增益旋钮,
使波形的峰-峰值在1/2屏幕宽度左右。然后观察方波的上、下两
边,看是否水平。如果出现过冲、倾斜等现象,则说明需要调节
探头上的匹配电容。用小螺丝刀调节之,直到上下两边的波形都
水平,没有过冲为止。当然,可能由于示波器探头质量的问题,
可能调不到完全无失真的效果,这时只能调到最佳效果了。

    另外就是示波器上还有一个选择量程的小开关:X10和X1。
当选择X1档时,信号是没经衰减进入示波器的。而选择X10档时,
信号是经过衰减到1/10再到示波器的。因此,当使用示波器的X10
档时,应该将示波器上的读数扩大10倍(有些示波器,在示波器
端可选择X10档,以配合探头使用,这样在示波器端也设置为X10
档后,直接读数即可)。当我们要测量较高电压时,就可以利用
探头的X10档功能,将较高电压衰减后进入示波器。另外,X10档
的输入阻抗比X1档要高得多,所以在测试驱动能力较弱的信号波
形时,把探头打到X10档可更好的测量。但要注意,在不确信号电
压高低时,也应当先用X10档测一下,确认电压不是过高后再选用
正确有量程档测量,养成这样的习惯是很有必要的,不然,哪天
万一因为这样损坏了示波器,要后悔就来不及了。经常有人提问,
为什么用示波器看不到晶振引脚上的波形?一个可能的原因就是
因为使用的是探头的X1档,这时相当于一个很重的负载(一个示
波器探头使用×1档具有上百pF的电容)并联在晶振电路中,导致
电路停振了。正确的方法应该是使用探头的X10档。这是使用中应
当注意的,即或不停振,也有可能因过度改变振荡条件而看不到
真实的波形了。

    示波器探头在使用时,要保证地线夹子可靠的接了地(被测
系统的地,非真正的大地),不然测量时,就会看到一个很大的
50Hz的信号,这是因为示波器的地线没连好,而感应到空间中的
50Hz工频市电而产生的。如果你发现示波器上出现了一个幅度很
强的50Hz信号(我国市电频率为50Hz,国外有60Hz的),这时你
就要注意下看是否是探头的地线没连好。由于示波器探头经常使
用,可能会导致地线断路。检测方法是:将示波器调节到合适的
扫描频率和Y轴增益,然后用手触摸探头中间的探针,这时应该能
看到波形,通常是一个50Hz的信号。如果这时没有波形,可以检
查是否是探头中间的信号线是否已经损坏。然后,将示波器探头
的地线夹子夹到探头的探针(或者是钩子)上,再去用手触摸探
头的探针,这时应该看不到刚刚的信号(或者幅度很微弱),这
就说明探头的地线是好的,否则地线已经损坏。通常是连接夹子
那条线断路,通常重新焊上即可,必要时可更换,注意连接夹子
的地线不要太长,否则容易引入干扰,尤其是在高频小信号环境
下。示波器探头的地线夹子应该要靠近测量点,尤其是测量频率
较高、幅度较小的信号时。因为长长的地线,会形成一个环,它
就像一个线圈,会感应到空间的电磁场。另外系统中的地线中电
流较大时,也会在地线上产生压降,所以示波器探头的地线应该
连接到靠近被测试点附近的地上。

    本文是圈圈参加END博客大赛的文章,希望大家支持一下
圈圈,点一下左上角那个“顶一下”,给圈圈投一票,谢谢了。

                          (By  computer00   @2008-05-13)

点击此处查看原文 >>

系统分类: 测试测量   |    用户分类:    |    来源: 原创

评论(18) | 阅读(1926)
发表于:2008-5-8 0:09:12
标签:吉他效果器  软件  AmpliTube  

11

推荐一个吉他效果器软件——AmpliTube

玩电吉他肯定少不了效果器,但是好一点的效果器都很贵,便宜的又没啥效果……

吉他效果器软件是一个运行在个人电脑上的程序,以数字信号处理的方式来实现各种

效果。AmpliTube内置了很多效果器模块以及很多配置好参数的模块,因此使用起来非常

方便。经过圈圈的实际使用,感觉效果很好,所以推荐给玩吉他的朋友们。下载地址:

http://www.lyslys.org/file/temp/AmpliTube2/AmpliTube2.1.rar

普通声卡延迟可能比较大,如果声卡支持ASIO模式的话,延迟就可以非常小,我用的是

SB LIVE CT4620声卡,装上KX驱动后,就支持ASIO模式了,我现在设置的缓冲为384字节,

延迟时间为8ms左右,已经感觉不到了。另外一个效果器软件——Guitar RIG也不错,不过

感觉没有AmpliTube好用,所以我选择了后者。

下面是圈圈使用这个软件效果器录制的一段《光辉岁月》的前奏,大家应该都比较熟悉吧,

下载地址1:光辉岁月前奏.rar

下载地址2:点击下载

音色还是挺不错的。圈圈弹的是前奏的主旋律部分,伴奏是用现成的。

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类:    |    来源: 原创

评论(2) | 阅读(725)
总共 , 当前 /,2345678910>>下一页