手电大家谈-手电筒爱好者之家

 找回密码
 注册成为会员,享受更多功能。

QQ登录

只需一步,快速开始

只需一步,快速开始

搜索
查看: 9106|回复: 18

[原创]调试成功,atiny13+AN9926,10段可调带闪,电池电压检测

[复制链接]

该用户从未签到

发表于 2007-5-27 21:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册成为会员,享受更多功能。

x
<p></p><p>

[原创]调试成功,atiny+9926,10段可调带闪,电池电压检测

[原创]调试成功,atiny+9926,10段可调带闪,电池电压检测
</p><p></p><p>程序如下:</p><p>#include &lt;avr/io.h&gt;<br />#include &lt;avr/signal.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/delay.h&gt; <br />#include &lt;avr/eeprom.h&gt;<br /><br />#define key1 PB1<br />#define key2 PB4<br /><br />#define set_led_ddrDDRB|=_BV(PB0)<br />#define clr_led_ddrDDRB&amp;=~_BV(PB0)<br />#define led_offPORTB&amp;=~_BV(PB0)<br />#define led_onPORTB|=_BV(PB0)<br /><br />#define uchar unsigned char<br />#define uint unsigned int<br />#define uint8 uint8_t<br /><br />/* 定义全局变量 */<br />int light=205;<br />int inter_count=0;<br />uchar adc_val;<br />uint8 power=0,cpu_sta=0x20,flash_sign=0,flash_count=0;</p><p>//********** 按键检测 *******************<br /><br />void check_key(void)<br />{<br />if(!(PINB&amp;0X10))<br />{<br />power=0;<br />while(!(PINB&amp;0X10)) ;//按住按键2s进入闪烁模式,以4Hz的频率闪烁<br />_delay_ms(5);<br />}<br />}<br /><br />//****** 电池电压检测 *****************<br /><br />void adc_check(void)<br />{<br />adc_val=ADCH;<br />if(adc_val&lt;0x7A) <br />{<br />light=0;<br />DDRB=0X00;<br />MCUCR=0X20;<br />inter_count=0;<br />PORTB=0X02;<br />}<br />}<br /><br />//********** 开灯和关灯 **************<br /><br />SIGNAL(SIG_INTERRUPT0)<br />{<br />inter_count++;<br />flash_sign=0;<br />flash_count=0;<br />if(inter_count==1)//开灯,配置寄存器<br />{<br />PORTB=0X13;<br />power=1;<br />cpu_sta=0;<br />set_led_ddr;<br />light=eeprom_read_byte(0);<br />_delay_ms(1);<br />OCR0A=light;//比较匹配值,ledl亮度<br />TCNT0=0;<br />TCCR0A=0Xc3;//比较匹配模式,快速PWM模式<br />TCCR0B=0X01;//64分频,输出频率f=70Hz<br />TIMSK0=0X02;//开比较匹配中断<br /><br />ADMUX=0X63;<br />DIDR0=0X08;<br />ADCSRB=0X00;<br />ADCSRA=0Xe3;<br /><br />while(!(PINB&amp;0X02));<br />_delay_ms(20);<br />}<br />if(inter_count&gt;=2) <br />{<br />light+=30;<br />if(light&gt;250) light=1;<br />while(!(PINB&amp;0X02));<br />_delay_ms(5);<br />}<br />if(power==0) <br />{<br />eeprom_write_byte(0,light);<br />_delay_ms(1);<br />cpu_sta=0x20;<br />clr_led_ddr;<br />led_off;<br />TCCR0B=0;<br />DDRB=0X00;<br />PORTB=0X02;<br />flash_count=0;<br />inter_count=0;<br />}<br />}<br /><br />//*********** 电池电压检测 ***********<br /><br />SIGNAL(SIG_OVERFLOW0)<br />{<br /><br />if(ADCSRA&amp;0X10) adc_check();<br />if(!(PINB&amp;0X10))<br />{<br />flash_count++;<br />if(flash_count&gt;254) flash_sign=1;<br />}<br />else ;<br /><br />if(flash_sign==1) <br />{<br />TCCR0B=0X04;<br />OCR0A=205;<br />}<br />else <br />{<br />TCCR0B=0X01;<br />OCR0A=light;<br />}<br />}<br /><br /><br />//******* 主程序 **************<br />int main(void)<br />{<br />GIMSK=0X40;<br />PORTB=0x02;<br />CLKPR=0X80;<br />CLKPR=0X06;<br />eeprom_write_byte(0,light);<br />_delay_ms(1);<br />sei();<br />while(1)<br />{<br />check_key();<br />MCUCR=cpu_sta;<br />if(power==0) asm("sleep");<br />}<br />}</p><p><br />功能:按键1为开机加调光,关机时,按下按键1,灯亮,然后按按键1调节亮度,先由亮至暗,然后至亮,循环.</p><p>此时按下按键2,然后再按下按键1,关灯.关灯时记录上一次灯的亮度,开灯自动读取..</p><p>若在开灯后长按按键2,灯爆闪...频率大概是2Hz.爆闪时按下按键1关灯</p><p>功耗(用万用表测量的,不是很准确,不过差不了很远):关灯电流:170uA,按此计算,1天放电=170uA*24=4mAH,10天放电=4*10=40mAH</p><p>软件设定锂电保护电压是3.2V左右.档数由软件设定,可更改..</p><p></p><p></p><p></p><p><br /></p>

[原创]调试成功,atiny+9926,10段可调带闪,电池电压检测

[原创]调试成功,atiny+9926,10段可调带闪,电池电压检测
<br />
[此帖子已经被作者于[lastedittime]1180274680[/lastedittime]编辑过]
回复 dsu_marcocopyright:copyright

使用道具 举报

该用户从未签到

发表于 2007-5-27 21:52 | 显示全部楼层
我虽是电路小白也支持楼主。。。。
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2007-5-27 21:59 | 显示全部楼层
<p>没相机,上不了手电的图片...</p><p>已经装配好了..入电筒测试关灯电流大一点,有220uA...</p>
回复

使用道具 举报

该用户从未签到

发表于 2007-5-27 22:19 | 显示全部楼层
关灯电流始终不是太爽啊,不过电路是挺爽的,什么时候量产啊?
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2007-5-27 22:41 | 显示全部楼层
<p>呵呵...测试工具不怎么好,刚才再次用万用表试过,几次都不一样,有一次300uA,有一次,接近0,明天过去学校的实验室拿借高精度的仪器测试一下....</p><p>不量产,我还是一个学生,这个是业余搞的,手头有个手电改造了一下...</p><p>有兴趣生产的朋友可以生产,我贪一点,要两个成品就行...</p>[em07]
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2007-5-28 10:32 | 显示全部楼层
<p>程序更新:今早再更改了程序,启用看门狗,增加抗干扰性能...</p><p>程序如下:</p><p>#include &lt;avr/io.h&gt;<br />#include &lt;avr/signal.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/delay.h&gt; <br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;avr/wdt.h&gt;<br /><br />#define key1 PB1<br />#define key2 PB4<br /><br />#define set_led_ddrDDRB|=_BV(PB0)<br />#define clr_led_ddrDDRB&amp;=~_BV(PB0)<br />#define led_offPORTB&amp;=~_BV(PB0)<br />#define led_onPORTB|=_BV(PB0)<br /><br />#define uchar unsigned char<br />#define uint unsigned int<br />#define uint8 uint8_t<br /><br />/* 定义全局变量 */<br />uint8 light=205;<br />uint8 inter_count=0;<br />uchar adc_val;<br />uint8 power=0,cpu_sta=0x30,flash_sign=0,flash_count=0;</p><p>//********** 按键检测 *******************<br /><br />void check_key(void)<br />{<br />if(!(PINB&amp;0X10))<br />{<br />power=0;<br />while(!(PINB&amp;0X10)) ;//按住按键2s进入闪烁模式,以2Hz的频率闪烁<br />_delay_us(30);<br />}<br />}<br /><br />//****** 电池电压检测 *****************<br /><br />void adc_check(void)<br />{<br />adc_val=ADCH;<br />if(adc_val&lt;0x75) <br />{<br />wdt_disable();<br />ADCSRA=0x00;<br />ADMUX=0x03;<br />MCUCR=0X30;<br />light=0;<br />inter_count=0;<br />DDRB=0X00;<br />PORTB=0X02;<br />_delay_us(20);<br />}<br />}<br /><br />//********** 开灯和关灯 **************<br /><br />SIGNAL(SIG_INTERRUPT0)<br />{<br />inter_count++;<br />flash_sign=0;<br />flash_count=0;<br />if(inter_count==1)//开灯,配置寄存器<br />{<br />wdt_enable(WDTO_2S); //开看门狗定时2S<br />PORTB=0X13;<br />power=1;<br />cpu_sta=0;<br />set_led_ddr;<br />light=eeprom_read_byte(0);<br />_delay_us(20);<br />OCR0A=light;//比较匹配值,ledl亮度<br />TCNT0=0;<br />TCCR0A=0Xc3;//比较匹配模式,快速PWM模式<br />TCCR0B=0X01;<br />TIMSK0=0X02;//开比较匹配中断<br /><br />ADMUX=0X63;<br />DIDR0=0X08;<br />ADCSRB=0X00;<br />ADCSRA=0Xe3;<br /><br />while(!(PINB&amp;0X02));<br />_delay_ms(2);<br />}<br />if(inter_count&gt;=2) <br />{<br />wdt_reset();<br />_delay_us(5);<br />wdt_enable(WDTO_2S);<br />light+=30;<br />if(light&gt;250) light=1;<br />while(!(PINB&amp;0X02));<br />_delay_ms(2);<br />if(inter_count&gt;250) inter_count=5;<br />}<br />if(power==0) <br />{<br />wdt_disable();<br />eeprom_write_byte(0,light);<br />_delay_ms(1);<br />cpu_sta=0x30;<br />ADCSRA=0x00;<br />ADMUX=0x03;<br />TCCR0B=0;<br />DDRB=0X00;<br />PORTB=0X02;<br />flash_count=0;<br />inter_count=0;<br />}<br />}<br /><br />//*********** 电池电压检测 ***********<br /><br />SIGNAL(SIG_OVERFLOW0)<br />{<br />wdt_reset();<br />if(ADCSRA&amp;0X10) adc_check();<br />if(!(PINB&amp;0X10))<br />{<br />flash_count++;<br />if(flash_count&gt;100) flash_sign=1;<br />}<br />else ;<br /><br />if(flash_sign==1) <br />{<br />TCCR0B=0X03;<br />OCR0A=200;<br />}<br />else <br />{<br />TCCR0B=0X01;<br />OCR0A=light;<br />}<br />}<br /><br /><br />//******* 主程序 **************<br />int main(void)<br />{<br />GIMSK=0X40;<br />PORTB=0x02;<br />CLKPR=0X80;<br />CLKPR=0X03;<br />eeprom_write_byte(0,light);<br />_delay_us(20);<br />sei();<br />while(1)<br />{<br />check_key();<br />MCUCR=cpu_sta;<br />if(power==0) asm("sleep");<br />}<br />}<br /></p><p></p><p>待机耗电期望中午可以完成...</p>
回复

使用道具 举报

该用户从未签到

发表于 2007-5-28 13:14 | 显示全部楼层
C语言……终于看懂了。。。。[em06]
回复

使用道具 举报

该用户从未签到

发表于 2007-5-28 15:22 | 显示全部楼层
<p>板有点大了。。</p>
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2007-5-28 15:56 | 显示全部楼层
<p>更新调试结果,发现关闭了看门狗后电流接近0,早上去实验室测试电流,发现万用表是比较准确的,终于实现了关灯接近0电流了...</p><p>楼上的,呵呵,怎么不把你的程序和电路贴出来呢?是商业秘密么?</p><p>板子是按照我的东东设计的,这个只合适我...</p>
回复

使用道具 举报

该用户从未签到

发表于 2007-5-28 16:50 | 显示全部楼层
我原来的那个电路现在已经放弃了,我设计的新电路还没有开始写程序,等会我帖个现在需要的手电结构图。
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2007-5-28 17:57 | 显示全部楼层
<p>好啊,期待你的电路...好好揣摩揣摩</p><p>现在最终确定的程序,开了看门狗,关灯电流&lt;1uA,atiny13使用频率,内部128KHz振荡器,再8分频,时钟频率很低, 自身功耗极低...</p><p>到此,整个电路算是完成了。业余的,代码基本没注释,为了省时间...</p><p></p><p>再说明下功能:</p><p>使用电池-锂电,</p><p>亮度档数-8(档数过多调节不方便),带爆闪,过压(3.2V)保护,自动记忆关灯前亮度,更换电池后第一次开灯为最大亮度的1/3. </p><p>驱动芯片参数:AN9926,双NMOS,栅极导通电压Vgs&lt;=1.2V,最大击穿电压BVdds&lt;=20V,最大导通电流Ida&lt;=6A,可做低压大功率驱动...</p><p>[em07]</p><p>程序如下:</p><p>#include &lt;avr/io.h&gt;<br />#include &lt;avr/signal.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/delay.h&gt; <br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;avr/wdt.h&gt;<br /><br />#define key1 PB1<br />#define key2 PB4<br /><br />#define set_led_ddrDDRB|=_BV(PB0)<br />#define clr_led_ddrDDRB&amp;=~_BV(PB0)<br />#define led_offPORTB&amp;=~_BV(PB0)<br />#define led_onPORTB|=_BV(PB0)<br /><br />#define uchar unsigned char<br />#define uint unsigned int<br />#define uint8 uint8_t<br /><br />/* 定义全局变量 */<br />uint8 light=185;<br />uint8 inter_count=0;<br />uchar adc_val;<br />uint8 power=0,cpu_sta=0x30,flash_sign=0,flash_count=0;</p><p>//********** 按键检测 *******************<br /><br />void check_key(void)<br />{<br />if(!(PINB&amp;0X10)) power=0;<br />while(!(PINB&amp;0X10));<br />}<br /><br />//****** 电池电压检测 *****************<br /><br />void adc_check(void)<br />{<br />adc_val=ADCH;<br />if(adc_val&lt;0x78) cpu_sta=0X30;<br />}<br /><br />//********** 开灯和关灯 **************<br /><br />SIGNAL(SIG_INTERRUPT0)<br />{<br />inter_count++;<br />flash_sign=0;<br />if(inter_count==1)//开灯,配置寄存器<br />{<br />PORTB=0X13;<br />power=1;<br />cpu_sta=0;<br />set_led_ddr;<br />light=eeprom_read_byte(0);<br />_delay_us(5);<br />OCR0A=light;//比较匹配值,ledl亮度<br />TCNT0=0;<br />TCCR0A=0Xc3;<br />TCCR0B=0X01;<br />TIMSK0=0X02;<br />ADMUX=0X63;<br />DIDR0=0X08;<br />ADCSRB=0X00;<br />ADCSRA=0Xe3;<br />while(!(PINB&amp;0X02));<br />_delay_ms(5);<br />wdt_enable(WDTO_2S);<br />}<br />if(inter_count&gt;=2) <br />{<br />wdt_reset();<br />wdt_disable();<br />if(power==0) cpu_sta=0x30;<br />else<br />{<br />light+=30;<br />if(light&gt;250) light=1;<br />if(inter_count&gt;250) inter_count=5;<br />}<br />while(!(PINB&amp;0X02));<br />wdt_enable(WDTO_2S);<br />_delay_ms(1);<br />}<br />}<br /><br />//*********** 电池电压检测 ***********<br /><br />SIGNAL(SIG_OVERFLOW0)<br />{<br />wdt_reset();<br />if(ADCSRA&amp;0X10) adc_check();<br />if(!(PINB&amp;0X10))<br />{<br />flash_count++;<br />if(flash_count&gt;70) flash_sign=1;<br />}<br />else flash_count=0;<br /><br />if(flash_sign==1) <br />{<br />TCCR0B=0X03;<br />OCR0A=205;<br />}<br />else <br />{<br />TCCR0B=0X01;<br />OCR0A=light;<br />}<br />}<br /><br /><br />//******* 主程序 **************<br />int main(void)<br />{<br />GIMSK=0X40;<br />PORTB=0x02;<br />CLKPR=0X80;<br />CLKPR=0X03;<br />eeprom_write_byte(0,light);<br />_delay_us(20);<br />sei();<br />while(1)<br />{<br />MCUCR=cpu_sta;<br />if(cpu_sta==0x30) <br />{<br />eeprom_write_byte(0,light);<br />wdt_disable();<br />TCCR0B=0;<br />ADCSRA=0x00;<br />ADMUX=0x03;<br />DDRB=0X00;<br />PORTB=0X02;<br />flash_count=0;<br />inter_count=0;<br />_delay_us(10);<br />asm("sleep");<br />}<br />check_key();<br />}<br />}<br /></p><p></p><p>&nbsp;</p><p>&nbsp;</p><p>附功耗图:</p> lWYZqux2.jpg <br />
[此帖子已经被作者于[lastedittime]1180347762[/lastedittime]编辑过]
回复

使用道具 举报

该用户从未签到

发表于 2007-5-28 18:03 | 显示全部楼层
你的电路很奇怪,使用了2.7欧姆的限流电阻,莫非你使用6V电池?如果是这样的话,全功率下,电阻上要消耗1.5W的功率,你并联的那三个小电阻不知道能不能承受的住。。。
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2007-5-28 18:14 | 显示全部楼层
呵呵...我那个1W的LED比较特殊(应该说质量是比较差的),串个2.7欧0.5W的电阻最大电流不过300mA,PCB上画的是3个1/8的电阻,实际我用的是1个0.5W的电阻,有点热,不烫,LED也是有点热,使用很久完全没有过热的问题...
回复

使用道具 举报

  • TA的每日心情
    开心
    2022-11-16 16:38
  • 签到天数: 184 天

    [LV.7]常住居民III

    发表于 2007-5-28 21:40 | 显示全部楼层
    这帖要顶,支持。看好楼主提到的带AD,可方便地真正地高效地实现锂镍兼容。
    回复

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2007-5-30 19:00 | 显示全部楼层
    <p>电源输入端用1AA的升压电路然后加个3.3V的稳压管就能使用了,因为锂电跟镍氢的电压不同,AD检测的子程序要修改,可以实现镍氢0.8V关灯.</p>
    回复

    使用道具 举报

    头像被屏蔽

    该用户从未签到

    发表于 2009-10-28 16:24 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    回复

    使用道具 举报

    该用户从未签到

    发表于 2009-10-28 22:26 | 显示全部楼层
    学习楼主的无私精神!谢谢!
    回复

    使用道具 举报

    头像被屏蔽

    该用户从未签到

    发表于 2009-11-7 10:37 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    回复

    使用道具 举报

    头像被屏蔽

    该用户从未签到

    发表于 2011-2-20 18:00 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    回复

    使用道具 举报

    本版积分规则

    小黑屋|手机版|Archiver|论坛自带搜索|下载论坛app|手电大家谈-手电筒爱好者之家 ( 备案序号:鲁ICP备05002565号 )
    以上言论纯属个人观点,与手电大家谈立场无关。
    最佳浏览模式:1920*1080


    GMT+8, 2024-11-16 04:24 , Processed in 0.217953 second(s), 64 queries , Gzip On.

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表