GNU工具链里的size大家应该都用过, 它可以显示elf/obj/exe/dll等可执行文件里各个段的大小, 非常方便. 加-A和-B参数分别是按sysv和berkeley格式显示, 默认带-B参数.

avr-gcc里的avr-size则又增加了一个-C的选项, 可以显示单片机flash和ram的占用比例, 需要同时用--mcu参数指定avr单片机的型号, 效果是这样的:

avr-size -C --mcu=attiny26 main.elf
AVR Memory Usage
----------------
Device: attiny26

Program:    1316 bytes (64.3% Full)
(.text + .data + .bootloader)

Data:         23 bytes (18.0% Full)
(.data + .bss + .noinit)

是不是很方便? 可惜arm-gcc里的size并没有这个选项, 于是从avr转到stm32之后, 常常会感觉到不方便.

后来发现, 只要在Makefile里all目标后面加上几行, 也能达到同样目的. 需要你的工具链里有sed和bc, sed用来从size的结果里截取包含数据的第二行, bc则用来作浮点运算.

        @arr=(`$(TRGT)size $(PROJECT)_rom.elf | sed -n '2p'`); \
        let flash=($${arr[0]}+$${arr[1]}); \
        let mem=($${arr[1]}+$${arr[2]}); \
        let flash_size=$(subst K,,$(FLASH_SIZE))*1024; \
        let mem_size=$(subst K,,$(MEM_SIZE))*1024; \
        flash_usage=`echo "scale=1;($$flash*100/$$flash_size)" | bc`; \
        mem_usage=`echo "scale=1;($$mem*100/$$mem_size)" | bc`; \
        echo "Flash: $$flash / $$flash_size bytes, $$flash_usage% Full (.text + .data)"; \
        echo "SRAM:  $$mem / $$mem_size bytes, $$mem_usage% Full (.data + .bss)"

效果如下:

arm-none-eabi-size main_rom.elf
   text    data     bss     dec     hex filename
  34928    2212    5316   42456    a5d8 main_rom.elf
Flash: 37140 / 65536 bytes, 56.6% Full (.text + .data)
SRAM:  7528 / 8192 bytes, 91.8% Full (.data + .bss)

74HC4046实验(2)

2015-10-09 by Stavros

在前几天复习HC4046计算的基础上又试了一下, 用atmega48的timer0将16M主时钟先256预分频再125分频, Toggle模式, 得到250Hz 50%占空比的方波作为参考频率; HC4046的VCO输出接到atmega48的T1口, 用timer1作为÷N分频器.

实测各种RC参数, 用HC4046的鉴相器2可以锁定在60kHz~165kHz, 800kHz~2.4MHz, 差不多有三倍的频率覆盖率, 给各种简单接收机做个本振应该是够了. 用鉴相器1只能锁定在120kHz~165kHz, 不过输出波形似乎稍微干净些.

有空再试试用DDS输出作为HC4046的参考频率. 这里DDS的频率不用很高, 在AVR的定时器中断里更新相位累加字就可以了. 这样应该就能做到1Hz级别的精密步进了.

read more

在STM32F051上重新实现了SD卡WAVE播放器

2015-10-09 by Stavros

前几年试过用AVR来播放sd卡上的wave文件. (链接: http://st.avros.net/articles/avr_sd_waveplayer_2.html) 这次改用stm32f051试了一遍, 28.224M晶振, 1.5倍频到42.336M, 这样48kHz和44.1kHz都可以按准确的比特率播放了.

DAC用的是PT8211, 软件方式写I2S数据, 结果还是有爆音. 大概I2S对时序要求比较严格, 有空了改成硬件I2S再试试.

顺便在这块板上试验了几块TFT LCD屏. SPI接口的TFT还是太慢, 清屏等操作时能看清刷屏过程. 并口的好用, 就是布线麻烦了点.

read more

复习74HC4046的相关计算(1)

2015-09-22 by Stavros

前两天没事复习了一下74HC4046的计算. 主要材料:

  1. 某个在线计算器, 只有VCO的计算. url: http://www.changpuak.ch/electronics/calc_03.php
  2. Motorola的AN1410: Configuring and Applying the MC74HC4046A Phase-Locked Loop
  3. Philips的Datasheet
  4. Texas Instruments的Application Report SCHA003B: CMOS Phase-Locked-Loop Applications Using the CD54/74HC/HCT4046A and CD54/74HC/HCT7046A

根据Philips的datasheet, 取$R_1$ = 10k, $R_2$ = 10k, $C$ = 500p, $V_\rm{CC}$ = 5.0V ...

read more

最近的三个制作:酒酿机、6F22充电器、太阳能充电器

2015-08-15 by Stavros
  1. 酒酿机

    做酒酿(醪醩)需要保持40度左右的温度发酵。正好家里有个最便宜的小熊酸奶机,不带控温功能的,能否用它来改装成酒酿机呢?

    把小熊酸奶机拆开一看,里面简单得一塌糊涂:铝板上装了个PTC电阻,直接接220V电源,作为发热器,旁边甩了两条线出来接前面板的指示灯。可以说毫无技术含量。于是把这些东西都拆掉,换成前几天做的PID控温电路。控温板上加了两个两位LED数码管,分别显示设定温度和实测温度,两个按键开关用来控温。加热器还是IRF530+LM35的配置。控温范围从35度到65度。

    发酵碗里装满水,放个温度计,开机一晚上实测……发现碗里的水温最终会比发热板的实测温度低15~20度。大概是因为发热板外面隔了一层塑料板,发酵碗又是一层塑料,两层塑料的热阻太大了。幸好温度已经能满足做酒酿的要求了。

    下次打算把LM35的引线接长一些,粘在发热板以外的塑料侧壁上,避免从发热板直接传导热量到LM35,这样效果也许会好些?

  2. 6F22充电器

    手里有两个可充电的6F22,但是一直没有好用的充电器。以前买过一个,拆开一看,里面实在是惨不忍睹,只好扔了。

    自己做了一个,电路图如下:

    从USB输入的5V电压,用TP7660二倍压得到10V,再通过100欧电阻限流后给6F22充电。TL061接成比较器,一个输入端接电池正极,另一个输入端接100欧电阻和1k电阻分压得到的约9 ...

read more

电有没有重量?

2015-08-11 by Stavros

如果手机没有了电,重量会不会减轻?

答:先说结论,手机没有电了确实会减轻。

但这不是 “电” 的重量,应该说是 “电能” 的重量。能量和重量是统一的。

减轻了多少呢?可以算一下:

假设手机电池标称电压是$3.7\mathrm V$,容量是$1800\mathrm{mAh}$,则它能储存的能量是$3.7\mathrm V\times1800\mathrm{mA}\times3600\mathrm s = 23976\mathrm J$.

根据$E=mc^2$,可得

$$\Delta m=\frac{\Delta E}{c^2} = \frac ...

read more

学习了一下散热片的简单估算

2015-08-09 by Stavros

常用的板翅式散热器,其有效散热面积为:$$散热面积=(翅片高度\times2\times翅片数量+基板宽度)\times截断长度$$

有效散热面积和热阻的关系:

A(cm2) Rsa(K/W)
500 2.0
250 2.9
100 4.0
50 5.2
25 6.5

简单拟合得:$R_\mathrm{sa}=23.3A^{-0.39}$。

总热阻$R_\mathrm{tot}=R_\mathrm{sa}+R_\mathrm{cs}+R_ ...

read more

如何计算钨丝的直径?

2015-08-07 by Stavros

知乎上一哥们提了个问题:3.7V 电压,1.2A 电流,用钨丝绕成螺旋式弹簧丝,工作温度在 1200 摄氏度左右,怎么计算出来需要用多大直径的钨丝?链接:http://www.zhihu.com/question/33791069/answer/57434994

以下是我的回答:

斯特凡-玻尔兹曼定律:$j^=\epsilon\sigma T^4$,其中$j^$为辐射通量,$\sigma$为斯特凡-玻尔兹曼常数,值为$5.67\times 10^{-8}\rm{J \cdot s}^{-1}\cdot\rm m^{-2 ...

read more

迷你智能电源

2015-07-14 by Stavros

做了个简单的小电源,用一节18650供电,可以输出1.26V、1.8V、2.5V、2.85V、3.3V、5.0V和6.0V,共7种电压,可以通过USB给18650充电,如图:

原理图:

充电使用TP4056,充电电流为1200/1.5k = 800mA。LM3478接成SEPIC电路,既能升压也能降压。单片机ATtiny13输出一路PWM信号,经滤波后控制LM3478的反馈端,从而控制输出电压。三只LED用于指示输出电压。

源程序:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/sleep.h>
#include "misc.h ...
read more

PID控温实验

2015-07-13 by Stavros

做了个PID温控器,原理图如下:

电源电压首先流经0.33欧的取样电阻R1,然后给加热器供电。加热器用随便一个TO220封装的N沟道MOS管就行,LM35用来测温。高端电流检测虽然麻烦些,但这样加热器的连线可以更简单,四条线就够了。

LM35输出的电压值经Mega48 AD转换后得到温度值。Mega48输出一路PWM经低通滤波后与取样电阻R1上的电压比较后控制MOS管的电流。之后用简单的PID算法即可实现控温了。

把MOS管和LM35用导热胶粘在一块95mm x 66mm的散热片上,实测用12V 2A的电源供电时,开环加热可以达到44度左右。启用PID控温后,可以在室温~44度之间把温度控制到设定值正负0.1度。

之后在这个基础上可以做很多东西了,比如酸奶机、酒酿机、煮温泉蛋机等等。

read more