sogohz 发表于 2008-11-13 01:01

共享一个AVR调光2*7135程序

采用ATtiny13v,5脚6脚各控制一个7135,程序很简单,很容易就能修改成你想要的电流等。
在开启60ms和2060ms之间关闭手电时能调光,60ms的延迟是出于防抖动的考虑。在DEBUG模式下,4脚接的LED可以指示可调时间段。调光顺序为单7135-双7135-单35ma-单175ma。
两个7135全开时最亮,用单个7135全开或PWM来调节其余亮度。

之所以这样考虑,是因为一个设想:我们知道PWM时电流=占空比*最大电流,
那么PWM时的光通量是不是也是=占空比*最大光通量呢?
如果设想成立,2只7135PWM50%和单个7135全开来比较,因LED在大电流时光电效率降低,应该会得出同样的电流下后者比前者要亮的结论。我写了对应的程序来测试,但苦于没有有效手段来测试PWM情况下的光通量,没法证实。

程序如下,采用GCC,够简练吧。初学AVR,还请前辈们斧正。

#include <io.h>
#include <util/delay.h>
#include <eeprom.h>
#include <interrupt.h>
#include <sleep.h>

#define DEBUG
// 9.6MHz
#define FREQ 9.6
#define ClkDIV 8
#define StepAddress ((uint8_t *) 62)
#define MaxStep 4
unsigned char step;
void DelayMs (unsigned int t)
{
unsigned int i;
for (i = 0; i < t; i++)
_delay_loop_2 (250 * FREQ / ClkDIV);
}
void disp ()
{
switch (step) {
case 0:// 单点1个7135
{
   DDRB |= _BV (PB0);
   PORTB |= _BV(PB0);
   break;
}
case 1:// 点2个7135
{
   DDRB |= (_BV (PB0) | _BV (PB1));
   PORTB |= (_BV (PB0) | _BV (PB1));
   break;
}
case 2:// 单个7135 35ma (350ma/10)
{
   DDRB |= _BV (PB0);
   OCR0A = 0x100 / 10;
   TCCR0A |= (_BV (COM0A1) | _BV (WGM01) | _BV (WGM00));
   TCCR0B |= (_BV (FOC0A) | _BV (CS01) | _BV (CS00));
   break;
}
case 3:// 单个7135 175ma (350ma/2)
{
   DDRB |= _BV (PB0);
   OCR0A = 0x100 / 2;
   TCCR0A |= (_BV (COM0A1) | _BV (WGM01) | _BV (WGM00));
   TCCR0B |= (_BV (FOC0A) | _BV (CS01) | _BV (CS00));
   break;
}
default:
   break;
}
}
int main ()
{
char newStep;
step = eeprom_read_byte (StepAddress);
if (step >= MaxStep)
step = 0;
disp ();

if ((newStep = step + 1) >= MaxStep)
newStep = 0;
DelayMs (60); // 延迟60ms到2060ms之间关闭可以调光
eeprom_write_byte (StepAddress, newStep);
#ifdef DEBUG
DDRB |= _BV (PB4);
PORTB |= _BV(PB4);
#endif
DelayMs (2000);
#ifdef DEBUG
PORTB &= ~ _BV(PB4);
#endif
eeprom_write_byte (StepAddress, step);
for (;;) {
set_sleep_mode(SLEEP_MODE_IDLE);
cli();
sleep_enable();
sei();
sleep_cpu();
}
return 0;
}

astray 发表于 2008-11-13 01:09

改成控制3个7135就完美了

SNAKELB 发表于 2008-11-13 01:41

进了学习下

828224 发表于 2008-11-13 01:42

见个见识

sogohz 发表于 2008-11-13 09:09

原帖由 astray 于 2008-11-13 01:09 发表 http://bbs.shoudian.org/images/common/back.gif
改成控制3个7135就完美了
改成3个、4个都很简单。ATtiny13 共有6个IO脚,除去一个用作RESET,还有5个可以单独控制5路,硬件PWM输出只有2路。

artie 发表于 2008-11-13 11:29

学习一下.....

ak47fans 发表于 2008-11-13 12:26

可以给一些多关于AVR的资料网页吗,好像怎样写到AVR我也不知怎么做.

artie 发表于 2008-11-13 12:34

http://www.315avr.com/index.asp

ak47fans 发表于 2008-11-13 15:38

请问一个最低配置,是不是要有这些东西
- 下载一个编程软件
- 并口51/AVR ISP下载器
- JTAG或ISP座(2*5,90°弯脚)

sogohz 发表于 2008-11-13 16:44

原帖由 ak47fans 于 2008-11-13 15:38 发表 http://bbs.shoudian.org/images/common/back.gif
请问一个最低配置,是不是要有这些东西
- 下载一个编程软件
- 并口51/AVR ISP下载器
- JTAG或ISP座(2*5,90°弯脚)

差不多。
我是自制的一个Altera 的ByteBlasterISP 下载线,线路极其简单,只用了一个74LS244和几个电阻,资料从ISPlay 1.3或1.5的文档中找。
ISP座倒也无所谓,我是用6针杜邦线和2个6脚的2.54mm间距排插。
ISP上位机软件是muCodeISP, http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=404397&bbs_page_no=1&sub_kind_id=1210&bbs_id=1000

这软件我找了好几个,就这个能用。isplay只能下51,不能下AVR。

avr市场做得差啊,好的网站不多,www.ouravr.com   算一个

ak47fans 发表于 2008-11-14 11:51

谢谢你的分享,我装好了 AVR Studio 4 及 WINAVR, 尝试了ouravr.com的第一个范例,已经能成功编译范例.用AVR studio编译你分享的程序時,找不到Header Files.
../test.c:1:16: error: io.h: No such file or directory
../test.c:3:20: error: eeprom.h: No such file or directory
../test.c:4:23: error: interrupt.h: No such file or directory
../test.c:5:19: error: sleep.h: No such file or directory
请问应该怎样解决

ak47fans 发表于 2008-11-14 12:22

解决了,改为
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
但我发觉在AVR Studio内编译跟在WinAVR内编译的结果不同,请问你是用那个编译的.

[ 本帖最后由 ak47fans 于 2008-11-14 12:35 编辑 ]

sogohz 发表于 2008-11-14 12:46

原帖由 ak47fans 于 2008-11-14 12:22 发表 http://bbs.shoudian.org/images/common/back.gif
解决了,改为
#include
#include
#include
#include
#include
但我发觉在AVR Studio内编译跟在WinAVR内编译的结果不同,请问你是用那个编译的.

我是用AVR Studio编译的。忘了说了,我把include/avr的目录加到include的搜索路径里了,所以不需要在.h前加avr/

artie 发表于 2008-11-14 13:02

"我写了对应的程序来测试,但苦于没有有效手段来测试PWM情况下的光通量,没法证实。.........."

也许可以拿相机用手动曝光的方式拍摄光斑进行对比,不过微小的亮度差别可能看不出来。

sogohz 发表于 2008-11-14 14:00

原帖由 artie 于 2008-11-14 13:02 发表 http://bbs.shoudian.org/images/common/back.gif
"我写了对应的程序来测试,但苦于没有有效手段来测试PWM情况下的光通量,没法证实。.........."

也许可以拿相机用手动曝光的方式拍摄光斑进行对比,不过微小的亮度差别可能看不出来。 ...

眼睛直接看,PWM的电路和直流电路是一样的。通过相机一看,PWM的电路明显有点闪。可惜我相机没手动,否则固定光圈和曝光时间,曝光时间超过1秒,应该能看出区别来吧。

mzbbs 发表于 2009-2-1 22:06

支持!!!!

kgje 发表于 2010-3-16 00:07

本帖最后由 kgje 于 2010-3-16 00:09 编辑

我对手电电路 很感兴趣,做个记号,明天再来看。

bnq 发表于 2010-3-16 08:51



眼睛直接看,PWM的电路和直流电路是一样的。通过相机一看,PWM的电路明显有点闪。可惜我相机没手动,否则固定光圈和曝光时间,曝光时间超过1秒,应该能看出区别来吧。 ...
sogohz 发表于 2008-11-14 14:00 http://www.shoudian.org/images/common/back.gif

手电电路因为体型成本限制要在led端做到直流估计有难度,个人感觉还是直接控制单个7135开闭效果比较好,设定为单个、二个、三个7135工作比较好

flykite 发表于 2010-3-16 09:29

{:1_217:}非常感谢17楼挖出来这么好一个帖子,学习了

phones 发表于 2010-3-16 21:46

页: [1]
查看完整版本: 共享一个AVR调光2*7135程序