搜索
bottom↓
回复: 14

程序如何设计,ATtiny13利用电位器改变pwm调节光,已解决了,呵呵

[复制链接]

出0入0汤圆

发表于 2011-8-25 11:48:03 | 显示全部楼层 |阅读模式
ATtiny13的PB2引脚检测电位器的电压,PB1输出pwm,如何设计程序,请高手指教。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入169汤圆

发表于 2011-8-25 12:28:46 | 显示全部楼层
电位器先与一个固定电阻分压至与内部基准相同(记得是1.25V),电位器抽头接到AD输入引脚。剩下就是根据AD修改PWM寄存器了。AD和PWM例子请参考:芯艺AVR单片机GCC程序设计
本坛有下。

出0入0汤圆

发表于 2011-8-25 12:53:37 | 显示全部楼层
这个就不要MCU了吧。。。

出0入0汤圆

发表于 2011-8-25 13:49:15 | 显示全部楼层
同意楼上,可以使用NE555

出0入0汤圆

 楼主| 发表于 2011-8-25 14:15:06 | 显示全部楼层
回复【1楼】lxvtag 团长
-----------------------------------------------------------------------

谢谢,呵呵,参考一下

出0入0汤圆

 楼主| 发表于 2011-8-25 14:15:47 | 显示全部楼层
回复【3楼】02015678 周光
-----------------------------------------------------------------------

之前是用的NE555,老师说效果不好,现在要用MCU了

出0入0汤圆

 楼主| 发表于 2011-9-6 09:06:01 | 显示全部楼层
回复【1楼】lxvtag 团长
-----------------------------------------------------------------------
谢谢您的指点!我直接用VCC做的参考电压,程序写出来了,PROTEUS中仿真也可以,但在硬件上调试时电位器电压值变化,但PWM输出没有变化,您觉得是什么原因呢?一直没有找到原因。对了,它的内部参考电压时1.1V。
AD检测部分用的是查询,在While(1)循环里检测,是因为太频繁而检测不到吗?

出0入0汤圆

 楼主| 发表于 2011-9-6 09:41:39 | 显示全部楼层
回复【3楼】02015678 周光
-----------------------------------------------------------------------

我们用的NE555,在电压很小时有一个跳变,就是光一下变暗了,在这个电压之前调节电位器都没有变化,你能知道大概是什么原因吗?

出0入169汤圆

发表于 2011-9-7 01:10:54 | 显示全部楼层
还没有解决么?如果你用的是芯艺的adc代码,那么直接while死循环查询是没问题的,验证方法很简单,读取完adc后修改pwm,延时20ms再重复。硬件没实现,检查程序是否真的跑起来了,熔丝位是否配置正确?

出0入0汤圆

 楼主| 发表于 2011-9-7 16:34:46 | 显示全部楼层
回复【8楼】lxvtag 团长
-----------------------------------------------------------------------

谢谢您,这么耐心。我是个新手,我用ADC中断出来了,不过用AD采样就是下面的程序,只把AD和主函数写这了,就是出不来,但在仿真时是可以的。您看看可能的原因是什么啊?
unsigned int get_ad(void)            
{
    unsigned int i;
    ADCSRA = 0x00;                      //disable adc
    ADMUX = 0x01;
    ACSR  = 0x80;
    ADCSRA = 0XC3;
    ADCSRB=0x00;
    while(!(ADCSRA & 0x10));                  /*等待采样结束*/
    i=ADCL;                           //Read 8 low bits first (important)
    i|=(int)ADCH <<8;                 //read 2 high bits and shift into top byte
    ADCSRA &= ~(1 << ADIF);                                /*清标志*/
    ADCSRA &= ~(1 << ADEN);                       //关闭转换
    return i;                                                        /*返回结果*/
}
void main(void)
{
unsigned int i;
unsigned char OCR0_V;
init_devices();
delay_ms(20);
  while(1)
{  
     delay_ms(20);
     i=get_ad();
                       //j=((unsigned long)i*256)/1024;  //注意数据溢出     
     OCR0_V=(unsigned char)(i/4);//用约分减少单片机压力
     OCR0B=OCR0_V;
  }
}

出0入169汤圆

发表于 2011-9-17 14:18:16 | 显示全部楼层
刚做完一个小玩意,AD也是用的VCC做基准。AD部分给你参考吧,基本来自芯艺那本书。

如果你真的想提高,建议找本书认真研读,我只看过芯艺的,推荐马老师的。

tiny系列可能因为太简单了,网上能找到的例程很少,很多时候得靠自己啃手册。

#include <avr/io.h>

#define uchar unsigned char
#define uint unsigned int

uint ADConvert()
{
        uchar i;
        uint ret;
        uint AdValue[8];
        uchar max_id,min_id,max_value,min_value;

        ADMUX = 0x01;                        //VCC作参考电压,通道1
        ADCSRA = _BV(ADEN);         //使能ADC,单次转换模式
        for(i = 0; i < 8; i++)        //转换8次
        {
                ADCSRA |= _BV(ADSC);
                _delay_loop_1(60);
                while(ADCSRA & _BV(ADSC))_delay_loop_1(60);
                ret = ADCL;
                ret |= (uint)(ADCH << 8);
                AdValue = ret;
        }
        ret = 0;
        for(i = 1; i < 8; i++)        //找到最大和最小值索引
                ret += AdValue;
        ret /= 7;
        max_id = min_id = 1;
        max_value = min_value = 0;
        for(i = 1; i < 8; i++)
        {
                if(AdValue > ret)
                {
                        if(AdValue - ret > max_value)
                        {
                                max_value = AdValue - ret;
                                max_id = i;
                        }
                }
                else
                {
                        if(ret - AdValue > min_value)
                        {
                                min_value = ret - AdValue;
                                min_id = i;
                        }
                }
        }
        ret = 0;                //去掉第一个和最大值与最小值后的平均值
        for(i = 1; i < 8; i++)
        {
                if((i != max_id)&&(i != max_id))
                        ret += AdValue;
        }
        if(min_id != max_id) ret /= 5;
        else ret /= 6;
        ADCSRA = 0;         //关闭ADC
       
        return ret;
}

出0入0汤圆

发表于 2011-9-29 11:00:03 | 显示全部楼层
不错的东东,经常来顶,菜鸟

出0入0汤圆

发表于 2011-11-3 15:41:51 | 显示全部楼层
回复【10楼】lxvtag 团长
-----------------------------------------------------------------------

请问下,ATtiny13A外部(除INT0)引脚电平变化中断入口是哪个啊?

出0入0汤圆

发表于 2014-11-7 13:56:03 | 显示全部楼层
本帖最后由 八岁跑码头 于 2014-11-7 15:57 编辑

给你一个BASCOM 编写的程序

$hwstack = 30                                               
$swstack = 0                                                
$framesize = 24
$regfile = "ATtiny13.dat"
$crystal = 9600000
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Up , Prescale = 1
Start Timer0
Start Adc
Ddrb = &B00000011

Dim A As Word
Tccr0a = &B11111111
Do
A = Getadc(2)
A = A / 4
Pwm0a = A
Loop
End  

出0入0汤圆

发表于 2014-11-11 19:55:56 | 显示全部楼层
谢谢分享!!!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 04:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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