CSK.Blog--个人原创Weblog

最近做的电子罗盘和惯导系统视频

贴些视频凑数好了,所谓凑数:不介绍、不说原理、不解释。等以后有机会和时间再介绍吧

 

2轴磁阻做成的电子指南针,画面上为PC通过该模块得道的地磁北极夹角,精确度<3度,分辨率0.1度。相应速率20Hz

 

 

Z-轴陀螺仪得道的原始角度信息,将用于惯导系统:

 

 

真感觉自己变成搞硬件的了,回想以前小学的时候还没接触电脑时对电子制作那种痴迷。不过那时候没文化,只是照着书上搭电路,同时没有现在如此便捷的网上购物,所用的电子元件都是从其他机器和垃圾中拆来的,没有匹配型号的就找别的代用。奇迹的是那时候还真能做出点东西,比如当时最喜欢做FM无线MIC,然后当成是一个广播电台用。另外就是做DC升压电路来得到300伏左右的高电压。

后来接触PC后就很少做这类东西了,现在想想主要原因是搞电子制作还是需要花很多精力和物力的。不想写程序,再复杂高效的算法,只要有思想,都可以实现。做电子设计就不同了,身边没有相关器件,就只能搁置。同时不是有本事就能做出顶尖的东西,比如我肯定做不出CPU... 所以搞电子设计的很容易让人有山寨的感觉,尤其是仅靠着家里的设备...

不过现在又感觉还是做电子的实在,因为这些是实实在在的东西。不过也可能是平时代码写多了想换下环境把...从去年开始Blog上就主要贴电子制作相关的东西了,其实也差不多那个时候开始业余就作点电子制作。这个过程还是有蛮多收获的,最有体会的就是把大学学的东西利用了起来(其实是前两年学的,后来CS的专业知识到一直挺管用)。到如今差不多1年了,感觉从去年下半年自己已经有点疯狂了...

说说我从去年9月份开始的AVR单片机学习和使用

原本是想把这篇文章的内容作为一个前言背景部分,不过发现写了不少,就干脆单独提出来一片。好给后续的文章做铺垫。

我会在明后几天发布一篇“ArduinoLite,高效且易用的AVR单片机运行库”的文章,来把这半年来我的一些工作成果推荐和分享给大家。

我从去年(2009)9月起开始接触AVR单片机。其实也就是利用业余时间基于他制作一些电子制作,当然也有将来会比较大规模的项目。或许大家也从之前几篇凑数性质的文章中看到了。

在正式开始本文前,我打算先介绍下一些背景知识,好让对这块领域暂时陌生的朋友有个了解。

AVR单片机是Atmel(atmel.com)公司推出的一款RISC指令集的8位单片机。因为它的高性价比(片上集成PWM, ADC, I2C, SPI,etc)和高运算效率(16MIPS@16Mhz),所以目前被广泛应用。
同时,另一个使得AVR受欢迎的原因是他的开发工具链很丰富。所谓丰富就是由商业的收费编译器(如ICC),也有开源免费的编译器gcc-avr。这使得对AVR的开发几乎是0成本的,并且gcc的强大也吸引着不少人。
我之前对单片机的了解仅是大二学校的一门电子科技创新课上接触过89S51单片机,从去年9月份开始打算利用AVR单片机来做些事情。于是就和其他人一样,我也开始去学习使用这个系列的芯片。这里就介绍下我再这个过程中的一些体会和心得,如果有朋友想开始涉足这个领域,不妨听我说说。顺便也是给后面的文章做铺垫...
首先我并没有去买市面上各类单片机的教程,而只是下载了AVR芯片的datasheet。毕竟一切的细节和资料都是来自datasheet的。不过如果光看着datasheet开始AVR编程实在有点痛苦,需要有一个容易上手的途径。
之前我已经从Makezine.org上听说有一个意大利的开源硬件项目Arduino(arduino.cc)是基于AVR芯片的(Atmega168),这个项目的特点是他定义了一个基于Atmega168的标准PCB版以及标准的引脚接口,并且提供了一套运行库和IDE环境方便开发者对AVR编程。

Arduino Board

图:标准Arduino板(图片来自arduino.cc首页)

 

虽然在很多专门从事单片机开发的人眼里看来这个东西基本和玩具无异(其实的确有自身的问题),但是作为一个没有接触过AVR芯片甚至完全没有单片机开发经验的人来说,Arduino大大降低了入门门槛,同时因为全世界有许多人都贡献了基于Arduino的一些应用,比如简单的如驱动马达转动到复杂的去实现一个机器人、基于Arduino的webserver等。丰富的外围代码和各类扩展硬件使得即使一个完全没有硬件设计背景的人也可以轻松的实现很复杂的应用。关于Arduino我就介绍到此,如果有兴趣可以去google了解下。

我当时就直接在taobao上购买了一块Arduino版正式开始AVR的使用。目标是一方面可以立刻基于Arduino带来的易用性来实现出我的想法,同时开始看Arduino运行库的代码,作为我对AVR芯片学习的开始。

Arduino的确是相当易用,首先它提供的IDE已经自包含了几乎所有单片机开发的工具链(avr-gcc, 烧录程序, 串口调试),同时也包含了不少的例子程序可以让使用者立刻解决一些现实问题,比如要实现控制LED很柔和的明暗渐变交替,有一个fading的现成例子就可以实现,如果略加改动,开发者还可以实现如通过PC来控制LED亮度这样的实验。

下面举个具体点的例子:

上图中可以看到PCB版上上下各有一排插口,并标有着数字。实际上这些插口是直接和AVR的芯片引脚连接的。那么,如果我将一个LED连接在上面标号为#9的针脚,希望做到的效果是让AVR控制这个LED从0%的亮度逐渐变成100%亮度,用Arduino我只要写入下的代码即可轻松实现。

pinMode(9, OUTPUT);

unsigned char led_brightness = 0;

for (led_brightness=0; led_brightness = 255; led_brightness++)

{

   analogWrite(9, led_brightness);

}

代码相信不需要我解释大家也能知道原理了,analogWrite就是设置一个引脚的模拟值(可以认为是#9的电压,自然数值越大LED就越亮),不过这里其实并不是真的设置了模拟的电压量,而是PWM占空比(wiki:Pulse-width modulation

这个analogWrite就是由Arduino所提供的函数。他已经将许多冗长的硬件寄存器配置操作包装了起来,提供给使用者易用的接口。这的确给初学者减轻了不少负担。如果不使用Arduino,仅依靠gcc提供的标准函数来实现这个看似简单的功能,则需要编写如下的代码。

//Set PWM mode: fast mode for timer 0
sbi(TCCR0A, WGM01);
sbi(TCCR0A, WGM00);

//set timer 0 prescale factor to 64
sbi(TCCR0B, CS01);
sbi(TCCR0B, CS00);

sbi(DDRB, PB1);

sbi(TCCR, COM11);

 

unsigned char led_brightness = 0;

for (led_brightness=0; led_brightness = 255; led_brightness++)

{

   OCR01 = led_brightness;

}

上面代码其实也不长,但一堆寄存器的设置相信还是会让许多第一次接触AVR的人头晕的。并且相信大部分人并不可能记住要实现这样一个功能需要设置哪些寄存器,更多的时候还是会去参考datasheet或者从已有的代码里复制过来。其实这些都是无谓的劳动,也容易增加出错的概率。

不过,作为对AVR的学习,还是必须了解其中底层的运行机制的。同时Arduino也有一些缺陷所以并不是所有情况下都能使用。所以之后我就边使用Arduino来做事情,同时对他的运行库代码作了许多修改并且进行大规模优化。这个将在后续的文章中介绍了。半年过去,我觉得至少在AVR这个领域,我应该算是精通了。

 

接下来我来分析下Arduino的一些限制和缺陷,也为衔接后续文章:-P

正如前面所说的,在很多专门从事单片机开发的人眼里,Arduino就像玩具一样。那么为何那么易用的东西会被如此看待?

当然一方面,正是因为宜用所以有人认为这是玩具,这种逻辑很多见:C#很易用,有人认为是玩具,Mac很易用,有人认识为玩具, etc... 当然这是不理性的想法,对于完全没有调查研究就下这样的结论自然是没有道理的。

撇开这个,我觉得主要还是因为Arduino自身的限制和缺陷造成的。

首先,Arduino这个概念其实有2个含义

a. Arduino PCB电路板

b. Arduino IDE,运行库

其实很多时候提到Arduino是2个含义兼有的,比如看到Arduino的标准电路板,自然就是a含义,而开发起来所谓的Arduino就是运行库。

那么这里先看Arduino作为一块硬件电路时候的情况:我想成熟产品中总不止于把一块Arduino板放进去吧...自然在这个含义下,那个就是“玩具”。这块版的用途很明显,就是给业余爱好者使用的。

那么作为运行库(软件)的情况下,Arduino也面临一些问题:

1). 仅支持Atmega8/Atmega168等/Atmega1280

2). 程序体积大,代码效率低

3). 对外围硬件存在一定假设,不能自由运用在任何外围电路中

1)和3)其实可以认为是一个问题,就是Arduino的运行库是专门为Arduino板或者兼容硬件设计的。Arduino板不可能用于产品,那么自然这个Arduino运行库也是没法用的(至少不加修改是不可能了)。同时还有别的问题,比如AVR的芯片种类很多,有不少是基于特定应用的。例如要采用AVR开发锂电池充电器,对于这样的需求,Attiny系列的芯片可能更加合适(价格便宜,充电器逻辑简单,过于强大的芯片资源也是浪费)。Arduino仅支持那些“中高端”部分的AVR芯片显然是不实用的。对于3),一个具体的例子是Arduino板上AVR普遍工作在16Mhz和8Mhz,所以Arduino运行库的代码实际上也仅支持16Mhz和8Mhz。但实际应用中可能要求AVR运行在很低的主频(1Mhz或者更低)。

其实上面这2个问题通过简单的修改Arduino运行库代码就可以解决了,应该说相对arduino库带来的好处相比还是很划得来的。当时关键就出在2)上。

程序体积大和代码效率低是关联的。再举一个很实际的例子:前面我提到的让LED渐变显示的功能,如果用Arduino,编译出来的程序需要消耗1-2Kb。如果用x86上的情况来看,1-2kb非常小。但其实情况是单片机都只有8KB左右的存储空间。有些型号,比如前面提过的Attiny系列只有2Kb。仅仅是实现一个LED渐变,或者说PWM输出,就消耗了Attiny的全部程序空间,这个肯定是不合算也没有人愿意的。就算是Arduino板采用的16KAVR,也意味着消耗了1/8的空间。这几乎都没做别的事情。做一个对比,用前面我给出的直接调用标准库的实现方式,虽然代码看上去啰嗦,但是编译产生的程序只有100字节左右。100:2048,这个差距实在是太大了。如此大的程序体积,自然效率就会低很多。

这几乎也是为什么Arduino不会被专门从事开发的人接受的根本原因了。

其实看过Arduino实现就知道出现2)的根本原因了:a.采用C++,b.过分的注重灵活性。

关于a.其实也不是核心问题,但是C++在默认情况下的确会产生加大的代码。而b.这里就非常明显。

这里再举前面的例子,我们来研究下analogWrite这个函数:

void analogWrite(uint8_t pin, uint8_t val)
{
 pinMode(pin, OUTPUT);
 if (digitalPinToTimer(pin) == TIMER1A) {
  // connect pwm to pin on timer 1, channel A
  sbi(TCCR1A, COM1A1);
  // set pwm duty
  OCR1A = val;
 } else if (digitalPinToTimer(pin) == TIMER1B) {
  // connect pwm to pin on timer 1, channel B
  sbi(TCCR1A, COM1B1);
  // set pwm duty
  OCR1B = val;

 } else if (digitalPinToTimer(pin) == TIMER0A) {
  if (val == 0) {
   digitalWrite(pin, LOW);
  } else {
   // connect pwm to pin on timer 0, channel A
   sbi(TCCR0A, COM0A1);
   // set pwm duty
   OCR0A = val;     
  }
 } else if (digitalPinToTimer(pin) == TIMER0B) {
  if (val == 0) {
   digitalWrite(pin, LOW);
  } else {
   // connect pwm to pin on timer 0, channel B
   sbi(TCCR0A, COM0B1);
   // set pwm duty
   OCR0B = val;
  }
 } else if (digitalPinToTimer(pin) == TIMER2A) {
  // connect pwm to pin on timer 2, channel A
  sbi(TCCR2A, COM2A1);
  // set pwm duty
  OCR2A = val; 
 } else if (digitalPinToTimer(pin) == TIMER2B) {
  // connect pwm to pin on timer 2, channel B
  sbi(TCCR2A, COM2B1);
  // set pwm duty
  OCR2B = val;
 } else if (val < 128)
  digitalWrite(pin, LOW);
 else
  digitalWrite(pin, HIGH);
}

实在太长了,我把其中的注释已经删去。可以看出arduino在实现上很讲究灵活性(这算是一种比较客气的说法)。那么,真的需要这么多代码吗?看看不用arduino时对他的等效实现: OCR01 = led_brightness;

仅仅是一行简单的赋值语句,即使是编译成了AVR机器码,也只有1条outb指令(2字节),而前者会产生多少代码就不用具体给出了。而这个的运行效率差别有多可怕也可以看出来了。

那么,这么多代码可否精简,但又能保持和以前完全一样的功能呢?

这个几乎是不可能的,如果仔细分析代码,可以看出那么多代码都只是在做一件事情:将Arduino采用的数字引脚的标号通过查表的手段映射回对应的AVR引脚。而只要这个函数允许接受任何Arduino引脚作为参数,它就必须有这样的动作存在。

但是实际情况中,PCB已经是做好的,比如LED和AVR的连接时固定不变的,自然也没有必要每次运行中都去查表。如果这个函数所操作的引脚是固定的话,自然就可以去除那些查表的操作了。

对Arduino运行库的改进:

针对上面这些分析,如果把Arduino运行库存在的这些问题都加以克服,并且仍旧继承Arduino易用的特点。那样相信会有很多人乐于使用它。从这里开始,Arduino所表示的含义将是他的运行库。硬件(Arduino板)自然是无法有什么改进的。

下面是我对arduino的改进,我将这个改进后的库称作ArduinoLite。

和Arduino运行库相比,ArduinoLite有如下增强

1. 增加了Attiny2313和Attiny26的支持

2. 支持1Mhz至20Mhz所有频率

3. 没有外部硬件假设,也就是说ArduinoLite可以用于任何支持的AVR芯片中,不需要对Arduino板兼容

4. 代码体积非常小,运行效率高

5. 新增加了一些工具函数

6. 全部改用C实现

具体的介绍和代码以及参考我将在后续的文章中给出,下面给一个直观的例子:

要在Attiny2313芯片上实现LED灯渐变点亮:假设LED连接在用ArduinoLite编号法则#9的引脚。

代码如下

#define LED_PIN 9

PIN_MODE(LED_PIN, OUTPUT);

PWM_ENABLE(LED_PIN);

unsigned char led_brightness = 0;

for (led_brightness=0; led_brightness = 255; led_brightness++)

{

   PWM_SET(LED_PIN, led_brightness);

}

 

这代码是否和用Arduino非常相似呢?编写者也不用去关心具体的寄存器配置状况。而且产生的代码是和之前直接去操作寄存器的版本完全一致的。像PIN_MODE() PWM_ENABLE() PWM_SET()最终均只产生一条指令。而且,和直接去操作寄存器相比,也有很大的优势:Attiny2313寄存器配置情况和Atmega168存在比较大的不同,采用ArduinoLite接口就完全不必考虑这种细节。自然也提高了代码的可移植性。

 

关于ArduinoLite的具体细节,请见我的后续文章:-)

贴个充数,不太成功的无线供电试验

这半年都没写过什么有技术含量的,实在对不起各位。而且形势也不容乐观,我也有点悲观。
这篇同样没有技术含量,是之前做过的一个不太成功到无线电能传输的试验。所谓不太成功就是我认为还没到应用价值。

目前做到的是1-2cm,最大5cm范围点亮LED发光,最大功率3V@16mA。

细节就不说了,实在感兴趣的可以单独问我,其实很多信息都在图片里。以后有空且有机会具体说说好了。

基于共振电感耦合,示波器上分别是发射和接收电感线圈的波形。频率调谐在12M。






人都是有惰性的,但是有时候还是要逼着去做点事情,否则恐怕什么都做不好了。

自制的山寨版Sunjar

不知山寨这个词何时已经变成DIY的代名词了... Sunjar是什么呢?它是由英国的一家叫做Suck UK公司(这什么名字)设计的可以存储阳光并在夜间释放的玻璃罐。有兴趣的可以自行google下(关键词:sunjar 淘宝)。

虽然这个玻璃罐并非真正是将阳光“存储”了起来,不过创意还是十分的不错。尽管就是一个太阳能灯,但是通过罐子这个概念一包装,就给人新奇感。

但是,撇开如此好的创意,看到其正品的售价(¥200 + )实在上我觉得买它太不值得了。同时,不出我预料的国内已经有不少仿品了,且开价都低于60。同时还声称拥有多种其它功能。后来,那些卖正品的卖家估计是自身利益受损,就想尽办法在商品描述中“诋毁”那些山寨货。我觉得最经典的一句是:“那些仿品罐子还允许随意切换黄色或者蓝色的光线,这个主意看似很妙,实则很糟糕。要知道这是一个存储阳光的罐子,不是地摊上的变色灯……”原文大致如此,看得我实在觉得好笑...

好了,不胡扯了。与其花大价钱买这个玻璃罐,还不如自己做一个吧。实用价值还是有一点的,比如当小夜灯。于是,我花了2个周末作了2个山寨版Sunjar:

白天将它们至于阳光处(阳台上即可),到了晚上(光线变暗时),它们就开始发光了:

像不像Diablo里边的Mana药剂瓶...

 以上便是这山寨Sunjar的效果。自认为很不错。Sunjar这样优秀的创意,再加之自己DIY,其中的乐趣绝对要比在Taobao上花大价钱买一个好!同时,我认为它的电气特性要远远高于那些200多地“正规军”。下面我主要介绍制作过程以及原理和成本与性能分析。欢迎各位仿制,此为开源硬件项目。

原理和性能

Sunjar其实原理十分简单,就是一个太阳能储能装置+LED。或者说就是一个太阳能灯。不过实际作起来,并不是简单的将光伏电池、充电电池与LED接在一起如此简单。需要考虑几个问题:

  1. 玻璃罐限制了太阳能电池的功率,输出电压也不高
  2. 需要有光控电路控制LED仅在夜间发光

一般能装进玻璃罐的太阳能电池板一般开路电压都在1.5-5V左右,且短路电流一般不会超过200mA。同时考虑成本因素,一般3-4V 40-180mA的太阳能电池板是比较合理的选择。同时这里的数值是需要在室外晴天阳光照射下才能实现的。同时单晶硅或者多晶硅太阳能电池的弱光性差,在阴天和市内基本就不会有什么电流了。因此这样的配置下,充电电池一般考虑使用单节或双节的(1.2-2.4V)。这样的选择能确保在白天大多数情况下,太阳能电池输出的能量能尽可能充入电池。

但一般LED都需要2V以上电压驱动,尤其是蓝色和白色LED需要的驱动电压更高,即使2.4V的电压下白色LED的发光亮度也不高。因此很有必要设计驱动LED用的升压电路。将LED端的电压提升到3-5V。

对于上述第二个问题很好理解,实现起来就是一个简单的开关电路。

下面是本山寨Sunjar采用的电路图:

该电路并不复杂,所用元件也很少,且基本都能从已有的废旧设备上拆下。这里我就简要的介绍下原理,后文会提到材料的来源和选择问题。

该电路主要分为2部分,一为驱动LED的升压电路,它可以整体上看作一个负载。当图中9012三极管集电极上施加0.6-3V的电压时,图中的8050以及电感构成了一个振荡电路,通过电磁感应会在输出端(LED两侧)产生峰值约为5V的脉冲电压。经过电解电容的滤波可近似看成直流。此时驱动LED将得到耀眼的光线。足以驱动玻璃罐发光。

电路另一部分为光控电路,其主要靠两个9013管的饱和/截至特性构成了非门,并经过末端的9012驱动升压电路工作。

经我测量,在使用单节镍氢电池(1.2V)供电时,电池出的输出电流在35mA。如果使用600mAh的充电电池供电的话,大致可以在整个晚上持续发光了。电路中采用了最高4V-180mA输出的单晶硅太阳能电池。虽然理论上存在将电池过充的风险。但是考虑到白天日照是不持续且不稳定的。因此该风险其实大部分情况是不存在的。且较高功率的太阳能电池也允许在室内将充电电池充满,并不一定需要在阳光下暴晒。可以说如此的山寨Sunjar性能应当是很强悍的。

成本、选材与制作

这里先介绍选材的问题。我想大部分人手头是不会留有什么元件盒这类东西的,因此这里我主要介绍如何从身边废弃物中取出有用的元件来制作电路。

首先是太阳能电池板,该组件直接关系到Sunjar的性能,前文已经提到了,我使用的是4V/180mA的单晶圆形太阳能电池,直径为80mm。采用的是压层封装,寿命在10-15年。太阳能电池板很多时候只能自己购买。目前taobao上卖太阳能电池板的商家十分多。要挑选自己合适的太阳能板是很方便的,这里要注意的是应当注重其寿命以及输出电流。我购买的单片价格约为¥9。如果不在乎寿命,使用滴胶封装的板子,价格应当会很便宜。

其次是充电电池,因为LED耗电并不好,一般选用600mAh的镍氢电池即可。没必要使用高容量的。我采用了GP AAA的600mAh镍氢电池。如果使用锂电池要注意充电电路,避免过充爆炸。

其次是电路中电感用到的磁芯,我推荐用环形的磁芯。也可用柱状的。环形的磁芯其实很好找,可以从废弃的电子镇流器或者节能灯灯泡底座(需要拆除)取出。然后使用0.5mm的漆包线或者单股导线分别绕9匝以及15匝。如果没有环形的磁芯,也可采用中波收音机内的磁棒。

上图中绕有漆包线的黑色环就是磁环

白色部分为用收音机磁棒天线制作的电感

其余元件基本都能从电子玩具废旧的电子设备里找到。或者可以替代。图中第一级9013集级处的可变电阻的目的是调节光控电路的灵敏度,也可忽略该电阻。

LED只要选用自己喜欢的颜色即可,不过最好采用高亮度,散色类型的。

如果能顺利搞到这些材料,细心的焊接好基本就能工作了。这里就不介绍元器件的常识了。

那么实在不想或者不会焊接电路怎么办?这里有2个办法:

  1. 其中的升压电路可以从地摊买到的单节电池驱动的LED手电,或者那种用单节五号电驱动的手机应急充电器中拆出。效果是一样的。
  2. 可以在taobao购买一个草坪太阳能灯,将所有电路拆出。

其实,如果你选择了第二个方案,其成本已经高出直接购买一个山寨版Sunjar了。但DIY的乐趣还是很值得的。

我先是做了一个原形电路来验证这个电路图,十分的原始,没有用PCB板,完全架空焊接。且用了2节充电电池供电/储能,因此驱动的LED比较亮。之后又在万用PCB上作了一个“精美版”,采用单节电池供电/储能。

对于罐子的选择,为了充分发挥山寨本色,外形上要和正版的类似。我用了宜家中卖的那种玻璃罐。其内径也正好是80mm。正好将太阳能板装入。不过宜家的罐子是全透明的,最好在内壁贴上磨砂纸这类的实现漫反射效果。

好了,下面就算算材料成本。

一个宜家的玻璃罐 ¥11

太阳能电池板 ¥9

充电电池 ¥10

电路部分 ¥0-10 (如果完全废物利用,就不算成本了)

这样算来总共花费还是很低的,虽然做工可能没有正品精美(其实有本事完全可以超越),但是性能上是远远超过正品的。并且我怀疑市面上销售的Sunjar无论是否正品,都采用的是滴胶工艺的太阳能电池,其寿命一般只有2-3年。进一步说,DIY的乐趣绝对不是花钱能买来的。如果做的很好拿去送人也很有面子(骗小姑娘?)。

如果你也对此感兴趣,欢迎仿制,有什么问题也欢迎交流。

PDA电池升级成功

最近不太更新自己的blog,主要是因为有很多事要做,特别是Flash网站。

我高中时候亲戚送我了台联想天玑5000s PDA,也不是什么很好的机子,WinCE3.0, Intel StrongArm 204Mhz,16M RAM。

在那时这简直是我的宝贝,毕竟到高三前我还在用PII 233MHz的电脑运行着win2k....

不过后来一次不幸把pda摔坏了,pda的背光变压器的磁环断裂,无奈送修。结果维修的十分不满意,现在想想还不如自己去修的好。

不过一直让我不爽的就是这个机器的电池实在太破了,只能用2个小时...比我现在的笔记本还少。而且高三后来迷上wqx,所以这个机器就一直荒废不用了。

这周lamhtz让我想起了我竟然还有个pda...那干脆就发挥它的余热吧,虽然功能上我已不是很需要了。

今天把电池换了,完成了我一庄心愿,但愿不要像现在可以当人体炸弹用的SONY Li电池那样危险就好了~

附上图片和解说~

 原先pda的电池的参数只能通过万用表检测,由于是3.6V,我正好有一块没用的NOKIA手机的1400mAh的充电电池替换,大小也正合适,把原先电池上连带的保护电路拆下接在替换电池上即可。

图:换上新电池的背面

正面

 

硬件合成器设计并制作完毕

最近不常更新blog主要是因为要处理协会的事,还有刚刚完成的电院科技创新,也就是这个合成器了……
现在模电也学得差不多了,感觉自己还是蛮喜欢电子设计的,于是5.6号去买了些比较好的设备,今后有时间就做些东西出来,所以这个blog也新开了电子设计板块。

上次提到我们科创小组要做一个硬件合成器,不过后来发现如果完全用波形来合成钢琴的音色实在复杂。而且白噪声(White Noise)加滤波器的方案不可行。加上电院科创突然说要在这周一评审,天啊,于是就用了3天时间作了下面这个音色和口琴类似的合成器。

点击图片可以看到原图

由于时间有限,所以电路也不算复杂,基本思路是由555定时器产生2khz左右的方波,然后通过包络器,再使用带有滤波器的LM386放大产生最后的音色。

在示波器上的最终波形这里没法给出了,大致类似一系列规则的脉冲信号。

下面是该合成器的主要原理图:

 用555时基合成器产生波形就不必说了,懂电子的朋友应该都知道的,主要是包络器的问题。我当时在google上搜索发现这方面资料网上国内几乎为0。而且自己模拟电路的知识还有限,以前尝试制作的用电容调节的可变增益放大器来产生包络的尝试失败。

一次偶然机会看到了通过改变CD4069的VDD电压,来控制其非门高电平的办法。只要在4069的VDD上用电容供电,在电容放电时,VDD的电压会呈指数下降,这样通过非门的信号幅值也会呈指数下降。而在4069的VDD接上电阻,可以起到电容充电时VDD电压指数上升。

这样,包罗器的起音和余音部分就正好解决了,而且基本上采用的是数字电路,方便啊~

这个合成器可以发出15个音节的波形,频率范围是220hz-2.5khz。差不多覆盖了2个八度的音调。通过调整板上15个电位器可以调整他们的音节。

最终为了让89s52芯片来控制他弹奏一首乐曲,15个音节的控制采用了4066模拟开关,而这部分又是最恶心的:

点击图片可以看到原图

 我记得Somnia 说过“拥有一台模拟合成器是每个DJ的梦想”,呵呵,这个也算是一个模拟合成器了吧……电院科创结束

分页:[«][1]2[»]

日历

<< 2015-6 >>

Sun

Mon

Tue

Wed

Thu

Fri

Sat

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)