24 февраля 2022 года в 5 утра, без объявления войны, россия напала на Украину.

Они пришли "освобождать народ от нацистов и националистов".
С этого момента наша жизнь изменилась на "до" и "после".
Нас освобождают от наших домов, от наших любимых, от наших родителей и от наших детей....
Тут я не буду никого агитировать или переубеждать, разумный человек найдёт всю информацию
в интернете, а для зомби никакие доводы и факты не послужат аргументом.

Я не умею много писать, да и без мата тут сложно что-то написать.
Поэтому выражу все мои чувства одним фото.

«Спасибо дедушка путин за счастливое детство и мое освобождение». ©

Дополню словами уважаемого человека, широко известного в узких кругах:
тут путин не виноват, не он нажал на кнопку сброса,
- виноват пилот, который нажал на кнопку сброса, мог промахнуться. виноваты жена/мать/брат/друг пилота, которые не позвонили ему, и не сказали "нет войне",
- виноват тот, кто отдал приказ, и виноваты его жена/мать/брат/друг,
- виноват тот, кто цеплял бомбу, потому что он мог её обезвредить, "ну бывает, не сработала",
- виноват кладовщик, виноват водитель, который перевозил эту бомбу. виноваты жена...и т.д., потому что не позвонили и не сказали "нет войне, не вези бомбы",
- виноваты все журналисты оркостана, потому что они врут,
- виноваты недограждане, потому что не сказали журналистам "не врите",
- виноваты все... все 160 миллионов,
- а те 2, 3, 5 тысяч, которые вышли, и которых запаковали, это даже не десятая процента, это погрешность... случайно оказавшиеся в мордоре люди. ©

PS: За несколько часов до вторжения был атакован и взломан крупный интернет хостинг в Киеве, где и размещался мой сайт. Только 16 марта отважным админам удалось частично восстановить работу хостинга. Далеко не все сайты выжили, т.к. были повреждены даже бэкапы.
Нет, нет, я не жалуюсь, нет. В цифровом мире нет ничего ценного, материального...


Due to periodic DDoS attacks, the forum may not be available.

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

Здесь только проекты на ATtiny
alex-spb
Пробегал мимо
Posts: 14
Joined: 07 Nov 2015 21:35

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

Post by alex-spb »

Вообще это задумано для откр. и закр. форточек в парнике.А логика такая- +14С откр. одна форточка при+16С-другая и при+10С-закр. обе.Спасибо за ответ.
IYra
Живу тут
Posts: 712
Joined: 01 Feb 2012 18:36
Location: Санкт-Петербург

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

Post by IYra »

alex-spb wrote:Вообще это задумано для откр. и закр. форточек в парнике.А логика такая- +14С откр. одна форточка при+16С-другая и при+10С-закр. обе.Спасибо за ответ.
Сделал такую логику.

Если температура меньше/равно 10 С - импульс на PB.0
Если температура больше/равно 14 С - импульс на PB.1
Если температура больше/равно 16 С - импульс на PB.2

Наверно имеет смысл дублировать импульсы каждые 10 сек
Фьюзы не изменились
Attachments
fan_open.rar
(22.16 KiB) Downloaded 354 times
alex-spb
Пробегал мимо
Posts: 14
Joined: 07 Nov 2015 21:35

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

Post by alex-spb »

Здравствуйте.Импульс на выходах нужен одиночный длительностью1сек. Этого будет достаточно для управления активатором (от авто) а если импульс будет повторяться то будут лишние срабатывания активаторов а это уже никчему.В архиве вы сделали содинарным импульсом или повторяющимся? Спасибо огромное за ваше участие.Если будут появляться вопросы можно будет к вам обратиться.
IYra
Живу тут
Posts: 712
Joined: 01 Feb 2012 18:36
Location: Санкт-Петербург

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

Post by IYra »

alex-spb wrote:В архиве вы сделали с одинарным импульсом или повторяющимся?
С одинарным
alex-spb wrote: Если будут появляться вопросы можно будет к вам обратиться ?
Можно
Sergey_202
Пробегал мимо
Posts: 12
Joined: 10 Nov 2016 11:55

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

Post by Sergey_202 »

Здравствуйте,
помогите поправить правильно программу что бы она соответствовала моим условиям.
Просто сам (не имея опыта написания программ) уже потерялся в ней при попытке правильно изменить, все условия выложил на форуме: управление ШИМом по внешней команде, индикация перегрева и неисправности датчика температуры.
IYra
Живу тут
Posts: 712
Joined: 01 Feb 2012 18:36
Location: Санкт-Петербург

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

Post by IYra »

Sergey_202 wrote: управление ШИМом по внешней команде, индикация перегрева и неисправности датчика температуры.
Вот собрался наконец-то. Проект и Протеус.
Шим сделан без начальной проверки. За минШИМ принято 50 %.
1. Напряжение на PB.2 измеряется каждые 100 мс и при достижение 3.3 В - ШИМ=255
2. Проверка датчика - проверка на обрыв и короткое замыкание. Вопрос по поводу температуры. Может ли t=0 ?
Индикация перегрева - один импульс длительностью 80 мс с периодом 0.5с
Индикация неисправности датчика - два импульса длительностью 80 мс с периодом 0.5с ШИМ = 50%
Attachments
fan_Sergey202.rar
(22.9 KiB) Downloaded 419 times
Sergey_202
Пробегал мимо
Posts: 12
Joined: 10 Nov 2016 11:55

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

Post by Sergey_202 »

IYra, Болшое спасибо,
будут вопросы могу обратиться за помощью?
IYra
Живу тут
Posts: 712
Joined: 01 Feb 2012 18:36
Location: Санкт-Петербург

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

Post by IYra »

Sergey_202 wrote:Спасибо, но это значительно отличается от моей схемы
и надо дополнить алгоритм Hardlocka (нужна та его часть где есть цикл измерения напряжения 5в для обеспечения минимальных оборотов вентилятора, в моем случае возможно изменение питающего напряжения вентилятора).
Я просто решил упростить схему. Поставить вместо транзисторов N-мосфет чтобы не грелось.
А нужно ли измерение напряжения 5в для обеспечения минимальных оборотов вентилятора ?
В принципе если при минимальном ШИМ вентилятор не включится - начнет расти температура - увеличиваться ШИМ
и мотор все таки заработает и ШИМ начнет падать.
Sergey_202 wrote: У меня в Протеусе ошибка Could not open MODDATA initializer file '..\dimmer.bin' [U1].
Да осталась ссылка в настройках U1. Подправил. Но у меня при включении ШИМ Протеус сразу начинает тормозить
Attachments
Протеус.rar
(17.91 KiB) Downloaded 375 times
Sergey_202
Пробегал мимо
Posts: 12
Joined: 10 Nov 2016 11:55

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

Post by Sergey_202 »

В моем конкретном случае нужно именно дополнить проект Hardlocka моими условиями, так как придется ставить в рабочую схему как дополнительную регулировку скорости вращения зависящей от температуры выходных силовых транзисторов, (Заводские установки устройства с запасом дают напряжение на вентилятор который шумом уже достал, по этому и хочется убавить лишние обороты при помощи сего девайса). Делители на входе я сам пересчитаю, Полевик на ШИМ тоже подберу, а вот условия по которым должно работать устройства сам изменить не могу, по этому и обратился за помощью. Как прошивку Hardlocka скрестить с прошивкой IYra без потери качества, получив все плюшки от скрещивания.

Добавлено спустя 10 минут 31 секунду:
Я только смог такой вариант изобразить, но опять же не уверен что правильно вроде условие по управлению внешним сигналом исполняется, но индикации неисправности датчика еще нет.

Code: Select all

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

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

/* MIN_TEMP - нижняя граница температуры (вкл. вентилятора), гр.C
   MAX_TEMP - граница выхода на макс. обороты вентилятора, гр.C
   DT - разница между MAX_TEMP и MIN_TEMP, что бы не считать в программе
   U5V - устанавливает нижнее значение напряжения, т.е. напряжение
         на вентиляторе до которого оно падает (в версии с невыключаемым
         вентилятором) при падении температуры ниже MIN_TEMP. Подбором
         этого значения надо обеспечить устойчивую работу вентилятора
         и не допустить его выключения. Т.е. при уменьшени этой констатнты
         так же уменьшатся обороты вентилятора, что полезно с точки зрения
         снижения уровня шума в нижнем температурном диапазоне регулировок.
         Исходная константа далее
          0x01FF - 7.6в. 
          0x01AD - 6.4в,                  
          0x016D - 5.8в,            
          0x014D - 5в, 
          0x00ED - 3.5в, 
          0x00BD - 3.3в. 
         При уменьшении ниже значения 0x00BD теряется стабильность работы.
         Т.е. на этапе отладки эту константу можно будет подобрать под конкретную
         модификацию вентилятора. Каждый вентилятор имеет свою нижнюю границу
         напряжения, при которой он ещё вращается. Температурный режим выходного
       транзистора можно таким образом значительно улучшить (?).
*/

#define MIN_TEMP 25
#define MAX_TEMP 55
#define DT 30
#define U5V 0x014D
#define UPB1 0x01AA 
#define BYTE    unsigned char

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;
int Q;

// 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.1 = 1;
PORTB.1 = 0;
delay_ms(100);
PORTB.1 = 1;
}

void Beep2(void)
{
DDRB.1 = 1;
PORTB.1 = 0;
delay_ms(100);
PORTB.1 = 1;
delay_ms(100);
PORTB.1 = 0;
delay_ms(100);
PORTB.1 = 1; 
delay_ms(200);
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
char t1, t2, T, dP;
BYTE t; 
BYTE w1buffer[9];  
volatile BYTE i,AllDataFF=1,NonZero = 0; 
//  int *val = (int*)w1buffer;
// 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);

    w1_init();
    w1_write(0xCC);
    w1_write(0x44);
    Q = read_adc(1);

    if (Q >= UPB1)     //if (Q >= UPB1)
   {
    PWM_ = 255;
    FanStoped = 0;
   }
    else
   {

    if ((T >= MIN_TEMP) & (T <= MAX_TEMP))
    {
     if (FanStoped)
     {
      PWM_ = Max;
      FanStoped = 0;
      goto e1;
     }
      dP = Max - Min;
      T = T - MIN_TEMP;
      PWM_ = ((dP / DT) * T);
      PWM_ = PWM_ + Min;

      goto e1;
    }
                                              
    if (T < MIN_TEMP)
    {
     PWM_ = 0;
     FanStoped = 1;
    }

    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=0b00000010;
//DDRB= 0b00000011;
PORTB=0x02;
DDRB=0x03;

// 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;
TCCR0A=0x83;
//TCCR0B=0x02;  //4,6 kHz частота на выходе.
//TCCR0B=0x01;  //37,6 kHz частота на выходе.
//TCNT0=0x00;
//OCR0A=0x00;
//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(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) /*& (j == 1)*/)
          {
            Max = i + 5;

            break;
          }
          /* if ((U < Max - 10) & (j > 1))
          {
            i = i + 10;
            OCR0A = i;
            delay_ms(500);
            j = 1;
          } */

        }
        //e3:

        for (i=Max; i>1; i--)
        {
          OCR0A = i;
          delay_ms(100);
          U = read_adc(2);
          if (U < U5V)
          {
            Min = i + 1;
            break;
          }
        }
        //e2:

        FanStoped = 1;

        #asm("sei")
      }

      };
}
IYra
Живу тут
Posts: 712
Joined: 01 Feb 2012 18:36
Location: Санкт-Петербург

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

Post by IYra »

Sergey_202 wrote: Как прошивку Hardlocka скрестить с прошивкой IYra без потери качества, получив все плюшки от скрещивания.
А ты попробуй прошивку IYra - может и скрешивать не надо. Но если очень надо - добавлю
Sergey_202
Пробегал мимо
Posts: 12
Joined: 10 Nov 2016 11:55

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

Post by Sergey_202 »

очень надо именно объединённый вариант, у Hardlocka нет индикации неисправности датчика температуры, а у IYra нет контроля напряжения питания вентилятора

Добавлено спустя 6 минут 57 секунд:
Уже плату изготовил под такой вариант, понимаю что можно делитель не распаивать, но всё же хочется полный вариант.
IYra
Живу тут
Posts: 712
Joined: 01 Feb 2012 18:36
Location: Санкт-Петербург

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

Post by IYra »

Sergey_202 wrote: Уже плату изготовил под такой вариант, понимаю что можно делитель не распаивать, но всё же хочется полный вариант.
А просто ради интереса попробуй мою прошивку. Как она будет работать ? Может какой косяк вылезет ?
Тем более что железо уже есть
Sergey_202
Пробегал мимо
Posts: 12
Joined: 10 Nov 2016 11:55

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

Post by Sergey_202 »

На днях попробую, надо комплектующие докупить, попробовать не проблема просто лазить в оборудование несколько раз не хочется, проверять все равно придется в искусственных условиях, ошибки могу и не найти.

Добавлено спустя 2 часа 14 минут 44 секунды:
IYra wrote:
Sergey_202 wrote: Уже плату изготовил под такой вариант, понимаю что можно делитель не распаивать, но всё же хочется полный вариант.
А просто ради интереса попробуй мою прошивку. Как она будет работать ? Может какой косяк вылезет ?
Тем более что железо уже есть
Жаль что в предлагаемом варианте N канальный полевик, плата сделана по схеме с P канальном полевиком (хотя это не особо критично).

Добавлено спустя 13 часов 56 минут 55 секунд:

Code: Select all

/*****************************************************
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>
//#include <ds18b20.h>
#define ADC_VREF_TYPE 0x00
#define BYTE unsigned char
#define WORD unsigned short int

/* MIN_TEMP - нижняя граница температуры (вкл. вентилятора), гр.C
   MAX_TEMP - граница выхода на макс. обороты вентилятора, гр.C
   DT - разница между MAX_TEMP и MIN_TEMP, что бы не считать в программе
   UminV - устанавливает нижнее значение напряжения, т.е. напряжение
         на вентиляторе до которого оно падает (в версии с невыключаемым
         вентилятором) при падении температуры ниже MIN_TEMP. Подбором
         этого значения надо обеспечить устойчивую работу вентилятора
         и не допустить его выключения. 
          0x01FF - 7.6в. 
          0x01AD - 6.4в,                  
          0x016D - 5.8в,            
          0x014D - 5в, 
          0x00ED - 3.5в, 
          0x00BD - 3.3в. 
         При уменьшении ниже значения 0x00BD теряется стабильность работы.
         Т.е. на этапе отладки эту константу можно будет подобрать под конкретную
         модификацию вентилятора. 
*/
#define MIN_TEMP 25
#define MAX_TEMP 55
#define DT 30
#define UminV 0x014D
#define UPB1 0x02A8 

BYTE PWM_ = 255;
BYTE FanStoped = 1; 
BYTE Error = 0; 
BYTE Errcount1; 
BYTE Err;
WORD Errcount;
WORD counter = 0; 
//eeprom int V;
//eeprom int D;// = 0;
/*eeprom*/ int Max = 0;
/*eeprom*/ int Min = 0;
int Q;

// 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;
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
char t1, t2, T, dP;

// Place your code here
  if (Error)
  {
   Errcount++ ;  
   if (Errcount==400)  // около 80  мс

    {
     Errcount =  0 ;  
     if (Err)
      {
       PORTB.1 = !PORTB.1; 
       Err-- ;
       } 
      Errcount1 ++ ; 
      if (Errcount1==7)   // 80*7 - 0.5 c
      {
       Errcount1 = 0; 
       Err = Error;
       } 
     }
   }

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);

    w1_init();
    w1_write(0xCC);
    w1_write(0x44);
    Q = read_adc(1);    // измеряем напряжение на PB1 
    
    Error = 0 ;
    if ((T==255)||(T==0))  // проблемы с датчиком                
    {  
     Error = 4; 
     PWM_ = 128; 
     goto e1;
     }
    
    if (Q >= UPB1)     // сравниваем напряжение на PB1 с установленным значением Q
    {
     PWM_ = 255;
     FanStoped = 0;
     }
     else
    {
      

     if ((T >= MIN_TEMP) & (T <= MAX_TEMP))
      {
       if (FanStoped)
        {
         PWM_ = Max;
         FanStoped = 0;
         goto e1;
         }
         dP = Max - Min;
         T = T - MIN_TEMP;
         PWM_ = ((dP / DT) * T);
         PWM_ = PWM_ + Min;

         goto e1;
        }
                                              
        if (T < MIN_TEMP)
        {
         PWM_ = 0;
         FanStoped = 1;
         }

        if (T > MAX_TEMP)
        {
         PWM_ = 255;
         FanStoped = 0;
         Error = 2;
         }

         e1:
         OCR0A=PWM_; 
         if (Error==0) PORTB.1 = 1;
    }
  }
 } 

// 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=0b00000010;
//DDRB= 0b00000011;
PORTB=0x02;
DDRB=0x03;

// 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;
//TCCR0B=0x02;  //4,6 kHz частота на выходе.
//TCCR0B=0x01;  //37,6 kHz частота на выходе.
//OCR0A=0x00;   // инвертирование PWM ?

// 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")

// Place your code here

while (1)
  {
    if (Max==0)
    
    {
     #asm("cli")
     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) /*& (j == 1)*/)
        {
         Max = i + 5;

         break;
         }
         /* if ((U < Max - 10) & (j > 1))
         {
          i = i + 10;
          OCR0A = i;
          delay_ms(500);
          j = 1;
          } */
       }
        //e3:

      for (i=Max; i>1; i--)
      {
       OCR0A = i;
       delay_ms(100);
       U = read_adc(2);
       if (U < UminV)
        {
         Min = i + 1;
         break;
         }
       }
        //e2:

        FanStoped = 1;
        #asm("sei")
     }

   } 
   
}
у меня получилось скестить два варианта?
IYra
Живу тут
Posts: 712
Joined: 01 Feb 2012 18:36
Location: Санкт-Петербург

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

Post by IYra »

Sergey_202 wrote:у меня получилось скрестить два варианта?
Да вроде похоже. Выкладываю и свой вариант с начальным расчетом диапазона ШИМ.
Поигрался в Протеусе. Диапазон сильно зависит от сопротивления мотора. Поэтому лучше как у Хардлока
Attachments
fan_Sergey_202_ver11.rar
(24.72 KiB) Downloaded 363 times
Sergey_202
Пробегал мимо
Posts: 12
Joined: 10 Nov 2016 11:55

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

Post by Sergey_202 »

IYra wrote:
Nizam wrote: При подаче питания на схему кулер включается в полную напряжение на нем 12в где то секунды 5 и потом шим начинает снижать до 10 вольт 6-7 секунды и выключает кулер. Это когда я не ставлю электролитический конденсатор параллельно вентилятору. Если подпаиваю конденсатор он вообще не снижает обороты.. В чем может быть дело? Прошивал не один контроллер.. все равно одной и тоже..
Попробуй тестовую прошивку. Надо к выводу 5 (PB0 - выход ШИМ) и 7 (PB2 - выход на бузер) подключить светодиоды через 100 Ом катодом к земле.
Светодиод на ноге 7 (бузер) должен моргать (1 сек горит / 1 сек не горит) - если не так значит фьюзы и частота МК
Светодиод на ноге 5 (ШИМ) должен менять яркость при нагреве датчика пальцем. В прошивке стоит

Если проблемы с датчиком Светодиод на ноге 5 начинает моргать в такт со Светодиодом на ноге 7
В этом варианте неисправность датчика температуры определяется иначе (гораздо интереснее, опрашивается сам датчик ),

Code: Select all

for (i=0; i<9; i++)
   { 
    t = w1_read(); 
    w1buffer[i]=t  ;    
    if (t != 0xFF) AllDataFF = 0;
    if (t != 0x00)  NonZero = 1 ;
   }
   i=w1_dow_crc8(w1buffer,8);   
   if ((i == w1buffer[8])&&(AllDataFF==0)&&(NonZero))    // нет ошибок
а предложенном варианте прошивки, исправность датчика проверяется по условию

Code: Select all

 if ((T==255)||(t1==0)) 
. Что если датчик при опросе будет давать некорректные значения, тогда это условие не будет выполняться (нет обрыва, нет замыкания,) и схема не будет работать.
в тестовой версии был более правильный вариант, ведь dallas может сам сказать о своей неисправности, его только надо спросить. или я в чем то заблуждаюсь?
IYra
Живу тут
Posts: 712
Joined: 01 Feb 2012 18:36
Location: Санкт-Петербург

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

Post by IYra »

Sergey_202 wrote: В этом варианте неисправность датчика температуры определяется иначе (гораздо интереснее, опрашивается сам датчик ),а предложенном варианте прошивки, исправность датчика проверяется по условию

Code: Select all

 if ((T==255)||(t1==0)) 
. Что если датчик при опросе будет давать некорректные значения, тогда это условие не будет выполняться (нет обрыва, нет замыкания,) и схема не будет работать.
в тестовой версии был более правильный вариант, ведь dallas может сам сказать о своей неисправности, его только надо спросить. или я в чем то заблуждаюсь?
Был сделан упрощенный вариант проверки так как мало памяти
Petrovich
Пробегал мимо
Posts: 1
Joined: 30 Jan 2017 20:24

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

Post by Petrovich »

Добрый вечер всем.
У кого есть прошивка с корректной работой БУЗЕРА, выложите пожалуйста.
С уважением, Виталий
PTAXA73
Пробегал мимо
Posts: 2
Joined: 22 Feb 2017 07:43
Location: Белоруссия г.Мозырь

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

Post by PTAXA73 »

В прошивке отключен контроль вращения вентилятора. Просто закомментированы следующие строки (97-100):
Доброе время. Не могли пояснить эту строку? Не разобрался. :(

Добавлено спустя 2 часа 15 минут 9 секунд:
alelula wrote:На втором был осторожней, вот для пони правильные фузы: cksel0,sut0,ckdiv8=0
На эти фузы галочки остальные снять в Пони?
Если вертеть долго шарик в руке,он сломается.
User avatar
hardlock
Администратор
Posts: 4010
Joined: 21 Jan 2009 14:48
Location: Minsk - zp.ua
Contact:

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

Post by hardlock »

PTAXA73 wrote:Доброе время. Не могли пояснить эту строку? Не разобрался.
в стройках 97-100 код "закоментирован" - перед ними стоит "/*", а после "*/" если убрать, то будет работать.
PTAXA73 wrote:На эти фузы галочки остальные снять в Пони?
да, указанные поставить, остальные снять.
PTAXA73
Пробегал мимо
Posts: 2
Joined: 22 Feb 2017 07:43
Location: Белоруссия г.Мозырь

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

Post by PTAXA73 »

hardlock wrote:да, указанные поставить, остальные снять.
Спасибо!!
Если вертеть долго шарик в руке,он сломается.
Sergey_202
Пробегал мимо
Posts: 12
Joined: 10 Nov 2016 11:55

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

Post by Sergey_202 »

Сколько не бился сам со своим вариантом так ничего не получается, То АЦП работает не правильно то реакция на изменившиеся условия работает с задержкой, то обороты двигателя сами начинают гулять, выкладываю свое творение помогите разобраться с непонятной ситуацией, на трех процессорах которые прошивал все работало по разному от чего сам был очень удивлен. Помогите кто ни будь разобраться в чем ошибка.

Code: Select all

#include <tiny13a.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 BYTE unsigned char
#define WORD unsigned short int
#define MIN_TEMP 35
#define MAX_TEMP 65
#define DT 30
#define UMinV 0x00E0  
#define UMinV_min 175 
#define UMinV_max 275
#define UPB1 0x02F6

BYTE PWM_ = 255;
BYTE Min = 0;
BYTE Max = 0;
BYTE Errcount = 0;
BYTE Errcount1 = 0;
BYTE Err = 0;
WORD counter = 0;
BYTE Error = 0;
BYTE i;
WORD U, V;
//*eeprom*/ int Max;// = 0; 
//*eeprom*/ int Min;// = 0; 

// 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 smrpm(void) //установка мин. оборотов
 {
#asm("cli")
  delay_ms(100);
  for (i = 32; i > 0; --i)
  {
   OCR0A = i;
   delay_ms(100);
   U = read_adc(2);
   if (U < UMinV)
   {
    Min = i;
    break;
   }
  }
#asm("sei")
 }


// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
 {
  BYTE t1, t2, T, dP;

  V = read_adc(1);
  U = read_adc(2);
// Place your code here

  if (Error)
  {
   Errcount++ ;
   if (Errcount == 20)  
   {
    Errcount = 0;
    if (Err)
    {
 	 PORTB.1 = !PORTB.1;
	 Err-- ;
    }
 	 Errcount1 ++ ;
	 if (Errcount1 == 20) 
	 {
	  Errcount1 = 0;
	  Err = Error;
	 }
   }
  }

  counter++;
  if (counter > 586)
  {
   counter = 0;

   w1_init();
   w1_write(0xCC);
   w1_write(0xBE);

   t1=w1_read();   //LSB
   t2=w1_read();   //MSB

   t2 = t2 << 4;
   t1 = t1 >> 4;
   T = (t2 & 0xF0) | (t1 & 0x0F);

   w1_init();
   w1_write(0xCC);
   w1_write(0x44);

   if (T == 255)
   {
    Error = 14;
    PWM_ = 192;
    goto e1;
   }

    if (T == 0)
    {
     Error = 12;
     PWM_ = 192;
     goto e1;
    }

     if (V > UPB1)
     {
      PWM_ = 254;
      Error = 10;
      goto e1;
     }

      if (T > MAX_TEMP)
      {
       PWM_ = 255;
       Error = 8;
       goto e1;
      }

       if ((V < UPB1) && (T <= MIN_TEMP) && (U < UMinV_min))
       {
        Error = 6;
        smrpm();
       }

        if ((V < UPB1) && (T <= MIN_TEMP) && (U > UMinV_max))
        {
         Error = 4;
         smrpm();
        }

         if (T <= MIN_TEMP)
         {
          PWM_ = Min;
         Error = 2; 
         goto e1;
         }

          if ((T >= MIN_TEMP) & (T <= MAX_TEMP))
          {
           dP = Max - Min;
           T = T - MIN_TEMP;
           PWM_ = ((dP / DT) * T);
           PWM_ = PWM_ + Min;
           goto e1;
          }

    e1:
    OCR0A = PWM_;
    if (Error == 0) {PORTB.1 = 1;}

  }
 }

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// 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 - доступен только для чтения и содержит физическое значение вывода порта

//                      RESET      CONTROL FAN   SENSOR TEMP    INPUT 1       OUT LED       OUT PWM
DDRB=0x03;  //DDRB=  (0<<DDB5)   | (0<<DDB4)   | (0<<DDB3)   | (0<<DDB2)   | (1<<DDB1)   | (1<<DDB0);
PORTB=0x2A; //PORTB= (1<<PORTB5) | (0<<PORTB4) | (1<<PORTB3) | (0<<PORTB2) | (1<<PORTB1) | (0<<PORTB0);

// 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=0x05;
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)
  {
   if (Max==0)
   {
#asm("cli")
    delay_ms(100);
    V = read_adc(1);

    for (i = 255; i > 127; i--)
    {
     OCR0A = i;
     delay_ms(100);
     U = read_adc(2);
     if (U < (V - 10))
     {
      Max = i;
      break;
     }
    }

#asm("sei")

      smrpm();
      //e3:
   }
  }

}
alex-spb
Пробегал мимо
Posts: 14
Joined: 07 Nov 2015 21:35

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

Post by alex-spb »

Привет всем.Собрал девайс при вкл.крутит на полную и не снижается.Датчик подкл. средний вывод к 2й ноге МК а 2 другие на корпус(если я правильно понял).Т.е.на датчик нет реакции.Какие будут мысли?Спасибо.
IYra
Живу тут
Posts: 712
Joined: 01 Feb 2012 18:36
Location: Санкт-Петербург

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

Post by IYra »

alex-spb wrote:Датчик подкл. средний вывод к 2й ноге МК а 2 другие на корпус(если я правильно понял).Т.е.на датчик нет реакции.
Подключить датчик по 3-х проводной схеме (как в термостате)
alex-spb
Пробегал мимо
Posts: 14
Joined: 07 Nov 2015 21:35

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

Post by alex-spb »

подкл.2мя проводами на2й ноге МК напряжение меняется через равные промежутки времени(4.6в-2.3в) На 5й ноге МК постоянно держится 0в и моторчик все время работает.МК прошил правильно может с фузами напортачил-не снял галку с CKDIV8.
IYra
Живу тут
Posts: 712
Joined: 01 Feb 2012 18:36
Location: Санкт-Петербург

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

Post by IYra »

alex-spb wrote:подкл.2мя проводами
Дак надо попробовать подключить 3 проводами
alex-spb wrote: МК прошил правильно может с фузами напортачил-не снял галку с CKDIV8.
Если галка обозначает установленный 0 - надо ее убирать
Post Reply