利用Makefile实现avr-size -C的效果
2016-01-03 by StavrosGNU工具链里的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)
在前几天复习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播放器
前几年试过用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)
前两天没事复习了一下74HC4046的计算. 主要材料:
- 某个在线计算器, 只有VCO的计算. url: http://www.changpuak.ch/electronics/calc_03.php
- Motorola的AN1410: Configuring and Applying the MC74HC4046A Phase-Locked Loop
- Philips的Datasheet
- 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充电器、太阳能充电器
-
酒酿机
做酒酿(醪醩)需要保持40度左右的温度发酵。正好家里有个最便宜的小熊酸奶机,不带控温功能的,能否用它来改装成酒酿机呢?
把小熊酸奶机拆开一看,里面简单得一塌糊涂:铝板上装了个PTC电阻,直接接220V电源,作为发热器,旁边甩了两条线出来接前面板的指示灯。可以说毫无技术含量。于是把这些东西都拆掉,换成前几天做的PID控温电路。控温板上加了两个两位LED数码管,分别显示设定温度和实测温度,两个按键开关用来控温。加热器还是IRF530+LM35的配置。控温范围从35度到65度。
发酵碗里装满水,放个温度计,开机一晚上实测……发现碗里的水温最终会比发热板的实测温度低15~20度。大概是因为发热板外面隔了一层塑料板,发酵碗又是一层塑料,两层塑料的热阻太大了。幸好温度已经能满足做酒酿的要求了。
下次打算把LM35的引线接长一些,粘在发热板以外的塑料侧壁上,避免从发热板直接传导热量到LM35,这样效果也许会好些?
-
6F22充电器
手里有两个可充电的6F22,但是一直没有好用的充电器。以前买过一个,拆开一看,里面实在是惨不忍睹,只好扔了。
自己做了一个,电路图如下:
从USB输入的5V电压,用TP7660二倍压得到10V,再通过100欧电阻限流后给6F22充电。TL061接成比较器,一个输入端接电池正极,另一个输入端接100欧电阻和1k电阻分压得到的约9 ...
电有没有重量?
如果手机没有了电,重量会不会减轻?
答:先说结论,手机没有电了确实会减轻。
但这不是 “电” 的重量,应该说是 “电能” 的重量。能量和重量是统一的。
减轻了多少呢?可以算一下:
假设手机电池标称电压是$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学习了一下散热片的简单估算
常用的板翅式散热器,其有效散热面积为:$$散热面积=(翅片高度\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如何计算钨丝的直径?
知乎上一哥们提了个问题: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迷你智能电源
做了个简单的小电源,用一节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 ...
PID控温实验
做了个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