Page 15 of 21

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 09 Apr 2015 06:59
by hardlock
VAG, добавьте

Code: Select all

if (PINB.1)
  {                
    Beep();
  } 
в процедуре main, там где идёт поиск 5 Вольт и первый старт вентилятора.

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 10 Apr 2015 09:56
by VAG
Привествую! hardlock, я так понял здесь нужно вставить кусок кода:
Image

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 10 Apr 2015 14:21
by hardlock
VAG, офигенно вырванный контекст. Вы думаете, я помню все исходнмки? Неужели сложно в текстовом виде с тегами "код". Сейчас не могу посмотреть, т.к. с телефона...

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 10 Apr 2015 16:09
by VAG
Извиняюсь, не подумал. :scratch:

Code: Select all

/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.8d Professional
Automatic Program Generator
© Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 12.02.2007
Author  : Hardlock                            
Company : CTO Y Zhuka                            
Comments: 


Chip type           : ATtiny13
Clock frequency     : 9,600000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 16
*****************************************************/

#include <tiny13.h>
#include <delay.h>

// 1 Wire Bus functions
#asm
   .equ __w1_port=0x18 ;PORTB
   .equ __w1_bit=3
#endasm
#include <1wire.h>
#define ADC_VREF_TYPE 0x00

#define MIN_TEMP 36
#define MAX_TEMP 66
#define DT 30
#define U5V 0x014D      

#define ALLTIME_5V     //раскомментировать, если на выходе должно быть всегда
                       //5 Вольт. Даже при Т < Tмин.   

int PWM_ = 255;
char FanStoped = 1;
int counter = 0;    
//eeprom int V;   
//eeprom int D;// = 0; 
/*eeprom*/ int Max = 0; 
/*eeprom*/ int Min = 0; 
//char m;


// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}


void Beep(void)
{
  //DDRB.2 = 1;
  PORTB.2 = 0;   
  delay_ms(100);
  PORTB.2 = 1;
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
  char t1, t2, T, dP;
  // Place your code here 
  counter++;
  if (counter > 4700)
  {
    counter = 0; 
  
    w1_init();   
    w1_write(0xCC); 
    w1_write(0xBE);
      
    t1=w1_read();   //LSB      
    t2=w1_read();   //MSB
    
    //Ff = (t1 & 0x0F);
    t2 = t2 << 4; 
    t1 = t1 >> 4;
    T = (t2 & 0xF0) | (t1 & 0x0F);
    if (T > 127) T = 0;
    
    w1_init();   
    w1_write(0xCC);
    w1_write(0x44); 
      
    
    
    if (!FanStoped & PINB.1)
    {                
      Beep();
    } 
      
    
#ifdef ALLTIME_5V                  
    if (T <= MAX_TEMP)
    {
#else
    if ((T >= MIN_TEMP) & (T <= MAX_TEMP))
    {
      if (FanStoped)
      {
        PWM_ = Max;
        FanStoped = 0;
        goto e1;
      }
#endif

      dP = Max - Min;
      if (T < MIN_TEMP)
      {
        T = MIN_TEMP;
      }
      T = T - MIN_TEMP;          
      PWM_ = ((dP / DT) * T);
      PWM_ = PWM_ + Min;     
      
      goto e1;
    }
    
#ifndef ALLTIME_5V    
    if (T < MIN_TEMP)
    {
      PWM_ = 0;     
      FanStoped = 1;
    }          
#endif
    
    if (T > MAX_TEMP)
    {        
      PWM_ = 255;
      FanStoped = 0;
      Beep();
    }
  
    e1:    
    OCR0A=PWM_;             
      
  }
  
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here
char i, j;
int U;
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

//Разряд DDRx - определяет направление передачи данных (0 - вход, 1 - выход).
//Разряд PORTx - если вывод определен выходом (DDRx = 1), то:
//       если установлена 1 - то на выводе устанавливается лог. 1
//       если установлена 0 - то на выводе устанавливается лог. 0
//       если вывод определен входом (DDRx = 0), то PORTx - определяет 
//       состояние подтягивающего резистора (при PORTx = 1 резистор подключен)
//Разряд PINx - доступен только для чтения и содержит физическое значение вывода порта

PORTB=0b00000110;
DDRB= 0b00000101;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150,000 kHz
// Mode: Fast PWM top=FFh
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
TCCR0A=0x83;
TCCR0B=0x02;
TCNT0=0x00;
OCR0A=0xFF;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;   

// ADC initialization
// ADC Clock frequency: 600,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: None
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: Off, ADC4: On
DIDR0=0x00;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x84;

// 1 Wire Bus initialization
w1_init();
w1_write(0xCC);
w1_write(0x44);

// Global enable interrupts
#asm("sei")  



while (1)
      {
      // Place your code here 
      if (Max==0)
      {    
        #asm("cli")    
        delay_ms(1000);
        //delay_ms(500); 
        
        Max = read_adc(2);
                              
        j = 5;
        for (i=255; i>1; i=i-j)
        {
          OCR0A = i;
          delay_ms(100);
          U = read_adc(2);
          if (U < Max - 10)
          {
            Max = i + 5;  
            
            break;
          }       
        }
        
        for (i=Max; i>1; i--)
        {
          OCR0A = i;
          delay_ms(100);
          U = read_adc(2);
          if (U < U5V)
          {
            Min = i + 1;
            break;
          }
          if (PINB.1)
  {                
    Beep();
  }
        }
        //e2:

#ifndef ALLTIME_5V        
        FanStoped = 1;    
#endif
        
        #asm("sei")
      }  

      };
}

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 10 Apr 2015 23:40
by hardlock
VAG, вроде бы правильно. Единственное "НО". Если вентилятор такие не крутится, то пищать будет с периодом 100мс и процесс уменьшения напруги удлинняется в 2 раза.

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 11 Apr 2015 09:24
by VAG
Доброго дня! Таки есть, пищит ускоренно. Так-то работает. Ещё вопрос есть, в прошивке (без изменений всяких) есть строки

Code: Select all

void Beep(void)
{
  //DDRB.2 = 1;
  PORTB.2 = 0;   
  delay_ms(100);
  PORTB.2 = 1;
}
Изменяя значение delay_ms(100), изменяется длительность сигнала на выходе МК и соответсвенно бузер пищит быстрее или более протяжённо, это более менее понятно, а как сделать чтобы изменить саму паузу между включениями бузера?
К примеру, как на рисунке http://radioparty.ru/images/stories/sch ... 240-01.GIF T1 - можно изменить, а T0 - всегда постоянна, подскажите пожалуйста, как это можно сделать в программе?

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 11 Apr 2015 11:36
by hardlock

Code: Select all

for (i=Max; i>1; i--)
        {
          OCR0A = i;
          delay_ms(100);
          U = read_adc(2);
          if (U < U5V)
Меняйте тут задержку. Это в "майне" и отвечает за поиск 5 Вольт, т.е. при первом включении. Если увеличить задержку, то ещё растянется опускание с 12 до 5 Вольт...

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 11 Apr 2015 12:26
by VAG
Спасибо тебе hardlock! Попробую изменить.

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 20 Jun 2015 02:19
by alexspb
Зраствуйте hardlock! немогли бы вы скрестить этот проект с соседним проектом Термостат ∆T=0,1°C т.е добавить туда шим выход вместо управления нагрузкой?

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 20 Jun 2015 14:42
by hardlock
alexspb, Здравствуйте.

Я временно (надеюсь) не у дел. Но! где-то в соседних темах проскакивал новый проект по ПИД регулированию на основе термостата - поищите.

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 20 Jun 2015 21:52
by alexspb
Спасибо,поищу

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 29 Jun 2015 20:41
by sergioflash
спасибо автору за конструкцию, поставил в инвертор автомобильный, стало намного тише.

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 24 Oct 2015 19:54
by srqemiko
Добрый день!У меня такой вопрос hardlock подскажите что нужно изменить в данной программе, чтобы контроль за вращением кулера был постоянным, как при достижении минимальной температуры так и до нее. То есть когда кулер вращается при минимальных 5 вольтах.

Code: Select all

/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.8d Professional
Automatic Program Generator
© Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 12.02.2007
Author  : Hardlock                            
Company : CTO Y Zhuka                            
Comments: 


Chip type           : ATtiny13
Clock frequency     : 9,600000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 16
*****************************************************/

#include <tiny13.h>
#include <delay.h>

// 1 Wire Bus functions
#asm
   .equ __w1_port=0x18 ;PORTB
   .equ __w1_bit=3
#endasm
#include <1wire.h>
#define ADC_VREF_TYPE 0x00

#define MIN_TEMP 36
#define MAX_TEMP 66
#define DT 30
#define U5V 0x014D      

#define ALLTIME_5V     //раскомментировать, если на выходе должно быть всегда
                       //5 Вольт. Даже при Т < Tмин.   

int PWM_ = 255;
char FanStoped = 1;
int counter = 0;    
//eeprom int V;   
//eeprom int D;// = 0; 
/*eeprom*/ int Max = 0; 
/*eeprom*/ int Min = 0; 
//char m;


// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}


void Beep(void)
{
  //DDRB.2 = 1;
  PORTB.2 = 0;   
  delay_ms(100);
  PORTB.2 = 1;
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
  char t1, t2, T, dP;
  // Place your code here 
  counter++;
  if (counter > 4700)
  {
    counter = 0; 
  
    w1_init();   
    w1_write(0xCC); 
    w1_write(0xBE);
      
    t1=w1_read();   //LSB      
    t2=w1_read();   //MSB
    
    //Ff = (t1 & 0x0F);
    t2 = t2 << 4; 
    t1 = t1 >> 4;
    T = (t2 & 0xF0) | (t1 & 0x0F);
    if (T > 127) T = 0;
    
    w1_init();   
    w1_write(0xCC);
    w1_write(0x44); 
      
    
    /*
    if (!FanStoped & PINB.1)
    {                
      Beep();
    } 
    */  
    
#ifdef ALLTIME_5V                  
    if (T <= MAX_TEMP)
    {
#else
    if ((T >= MIN_TEMP) & (T <= MAX_TEMP))
    {
      if (FanStoped)
      {
        PWM_ = Max;
        FanStoped = 0;
        goto e1;
      }
#endif

      dP = Max - Min;
      if (T < MIN_TEMP)
      {
        T = MIN_TEMP;
      }
      T = T - MIN_TEMP;          
      PWM_ = ((dP / DT) * T);
      PWM_ = PWM_ + Min;     
      
      goto e1;
    }
    
#ifndef ALLTIME_5V    
    if (T < MIN_TEMP)
    {
      PWM_ = 0;     
      FanStoped = 1;
    }          
#endif
    
    if (T > MAX_TEMP)
    {        
      PWM_ = 255;
      FanStoped = 0;
      Beep();
    }
  
    e1:    
    OCR0A=PWM_;             
      
  }
  
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here
char i, j;
int U;
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

//Разряд DDRx - определяет направление передачи данных (0 - вход, 1 - выход).
//Разряд PORTx - если вывод определен выходом (DDRx = 1), то:
//       если установлена 1 - то на выводе устанавливается лог. 1
//       если установлена 0 - то на выводе устанавливается лог. 0
//       если вывод определен входом (DDRx = 0), то PORTx - определяет 
//       состояние подтягивающего резистора (при PORTx = 1 резистор подключен)
//Разряд PINx - доступен только для чтения и содержит физическое значение вывода порта

PORTB=0b00000110;
DDRB= 0b00000101;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150,000 kHz
// Mode: Fast PWM top=FFh
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
TCCR0A=0x83;
TCCR0B=0x02;
TCNT0=0x00;
OCR0A=0xFF;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;   

// ADC initialization
// ADC Clock frequency: 600,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: None
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: Off, ADC4: On
DIDR0=0x00;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x84;

// 1 Wire Bus initialization
w1_init();
w1_write(0xCC);
w1_write(0x44);

// Global enable interrupts
#asm("sei")  



while (1)
      {
      // Place your code here 
      if (Max==0)
      {    
        #asm("cli")    
        delay_ms(1000);
        //delay_ms(500); 
        
        Max = read_adc(2);
                              
        j = 5;
        for (i=255; i>1; i=i-j)
        {
          OCR0A = i;
          delay_ms(100);
          U = read_adc(2);
          if (U < Max - 10)
          {
            Max = i + 5;  
            
            break;
          }       
        }
        
        for (i=Max; i>1; i--)
        {
          OCR0A = i;
          delay_ms(100);
          U = read_adc(2);
          if (U < U5V)
          {
            Min = i + 1;
            break;
          }
        }
        //e2:

#ifndef ALLTIME_5V        
        FanStoped = 1;    
#endif
        
        #asm("sei")
      }  

      };
}

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 25 Oct 2015 10:54
by IYra
srqemiko wrote:чтобы контроль за вращением кулера был постоянным, как при достижении минимальной температуры так и до нее. То есть когда кулер вращается при минимальных 5 вольтах
Не понятно. Что нужно то ? Поподробней

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 25 Oct 2015 13:59
by srqemiko
Мне нужно чтобы контроль за вращением кулера был постоянным. На данный же момент схема работает следующим образом при первом включении контроль за работой кулера не работает (контроллер не подает сигнала об остановке кулера бузер не включаеться), до тех пор пока температура не дойдет до температуры 66 градусов и первой сработки бузера который говорит, что температура достигла граничной температуры. Теперь после того как температура снижаеться и бузер перестает пищать и только после этого начинает работать контроль за остановкой кулера, то есть когда я его уже физически отключаю от схемы контроллер подает сигналы что с ним что-то случилось. Так вот вопрос что нужно изменить в проге чтобы испрать данную проблему и контроль за работой кулера был с первого включения и до последнего момента его работы. Строки в програме по контролю работы кулера раскомментированы. Зарание спасибо.

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 25 Oct 2015 22:23
by IYra
srqemiko wrote: Так вот вопрос что нужно изменить в проге чтобы испрать данную проблему и контроль за работой кулера был с первого включения и до последнего момента его работы.
Как я понял используется прошивка с постоянным включением вентилятора.
Можно попробовать заменить

Code: Select all

char FanStoped = 1;
на

Code: Select all

char FanStoped = 0;
тогда проверка заработает сразу после определения мин и макс значений PWM
Если надо чтобы контроль был и во время определения - то выше есть решение

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 27 Oct 2015 17:08
by srqemiko
Спасибо IYra все заработало нужным образом

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 05 Jan 2016 13:38
by LYG
Здравствуйте! Я только учусь программировать АВР, хотел бы поставить это устройство на светодиодную матрицу для контроля температуры. В общем такой вопрос, реально ли вместо пищалки поставить реле(естественно через транзистор) чтоб при достижении критической температуры (около 80 градусов) оно отключалось? Я не прошу писать код, просто подскажите, пожалуйста, где можно подсмотреть как это сделать)

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 05 Jan 2016 16:45
by IYra
LYG wrote: В общем такой вопрос, реально ли вместо пищалки поставить реле(естественно через транзистор) чтоб при достижении критической температуры (около 80 градусов) оно отключалось?
Можно вместо вызова Beep()

Code: Select all

   if (T > MAX_TEMP)
    {        
      PWM_ = 255;
      FanStoped = 0;
      Beep();
    }
просто включать PORTB.2

Code: Select all

   if (T > MAX_TEMP)
    {        
      PWM_ = 255;
      FanStoped = 0;
      PORTB.2 = 1;
    }
    else PORTB.2 = 0;
ну и поставить #define MAX_TEMP 80

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 07 Jan 2016 19:50
by hawkman
Здравствуйте. нет tiny13, но есть tiny25. помогите подправить исходник под этот контроллер. покупать tiny13 при наличии tiny25 не совсем целесообразно. Заранее спасибо.

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 07 Jan 2016 21:17
by IYra
hawkman wrote:нет tiny13, но есть tiny25. помогите подправить исходник под этот контроллер.
Заменить

Code: Select all

#include <tiny13.h>
на

Code: Select all

#include <tiny25.h>
и

Code: Select all

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;
на

Code: Select all

// Timer/Counter 0 Interrupt(s) initialization
TIMSK=0x02;
фьюзы выставить на 8 мГц и вроде должно заработать.
Там тайминги будут чуть длиннее но это не критично

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 08 Jan 2016 16:29
by hawkman
Спасибо за ответ. Все заработало.

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 17 Jan 2016 22:34
by VAG
hardlock, здравствуйте, подскажите пожалуйста - сделал ещё один ваш девайс, только прошивка из первого поста, с выключением вентилятора, (ранее делал с прошивкой 5V const.), скажите, снижение оборотов вентилятора длится примерно 1мин 10 секунд. Это правильно, так и должно быть? Фьюзы выставил такие же как на картинке, кроме SPMEN. С него галочка снята.

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 17 Jan 2016 22:41
by hardlock
VAG, должно быть около 30 секунд. Пожоже рабоатет на более низкой частоте. Или делитель включен, хотя тогда было бы значительно дольше.

Re: Регулятор 12V вентилятора на ATtiny13

Posted: 18 Jan 2016 22:05
by VAG
Странно, я всё перерыл, не могу понять в чём дело. Контроллер TINY13A, фьюзы такие же выставил. А когда заливаю прошивку 5v const., там всё работает как надо, там махом почти сбрасывает скорость с 12В до 5В и на 5В стабильно крутится. Фьюзы такие же....

Добавлено спустя 23 часа 6 минут 47 секунд:
hardlock, подскажите пожалуйста, в чём может быть дело?