В первом же посте, прямо под схемой написано
Серым обозначена цепь, которая позволяет контролировать вращение вентилятора.
Code: Select all
if (!FanStoped & PINB.1)
{
Beep();
}
Большое вам за это спасибо!!! Я не хотел вас обидеть ! А тему я прочитал и не один раз , я видел где обсуждался этот вопрос даже потом сам читал в инете как это сделать! но так как я не разу не связывался с этими программами да еще и на английском . попробовав несколько рас переделать нечего не получилось, по этому и обратился к вам за помощью.hardlock wrote:runy,
4) своими поделками я не хвастаюсь, а БЕСПЛАТНО,без рекламы и СМСделюсь со всеми пользователями интернета. К сожалению много проектов до сих пор не выложено, по озвученой в п. 3 причине. В замен лишь прошу потратить 0,5 - 1 час своего времени на прочтение темы, т.к. большинство вопросов уже обсудили.
проверил работает нормально когда вентилятор останавливаешь рукой пищит бузер. только почему то не постоянно а прерывисто! не подскажите почему?hardlock wrote:runy, ещё никто не проверил эту функцию... ]
Code: Select all
#define PB2 0x01AA для возможности корректировки значения входного напряжения на PB2 (7нога)
Code: Select all
//DDRB.1 = 1; из-за переключения PB2 на PB1 (6нога)
PORTB.1 = 0;
delay_ms(100);
PORTB.1 = 1;
PORTB=0b00000010; переназначение портов
DDRB= 0b00000011;
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>
#define ADC_VREF_TYPE 0x00
#define MIN_TEMP 30
#define MAX_TEMP 65
#define DT 35
#define U5V 0x014D
#define PB2 0x01AA
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.1 = 1;
PORTB.1 = 0;
delay_ms(100);
PORTB.1 = 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);
w1_init();
w1_write(0xCC);
w1_write(0x44);
/*
if (!FanStoped & PINB.1)
{
Beep();
}
*/
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;
// 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);
Max = read_adc(2);
j = 5;
for (i=255; i>1; i=i-j)
{
OCR0A = i;
delay_ms(500);
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")
}
};
}
Code: Select all
while (1)
{
delay_ms(100);
Q = read_adc(1);
if (Q >= PB2)
{
PWM_ = 255;
FanStoped = 0;
}
}
//e4:
FanStoped = 1;
#asm("sei")
}
Code: Select all
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)
}
оказывается я не один такой, как же решить проблему?Man wrote:Здравствуйте!
Очень хороший проект. Спасибо!
Вот только не хватает возможности принудительно (A/C request) не зависимо от температуры включать вентилятор
на заранее установленную в программе скважность (25-35%) ..необходимо для охлаждения радиатора-конденсатора кондиционера
Соотв. прошу автора доработать программу таким образом
чтобы по 1 или 7 ноге низкий уровень активировал дополнительную нижнюю границу шима ..для начала пусть это будет 30%
и не мешал увеличению шим при дальнейшем росте температуры
..и если не затруднит сразу сделайте:
T min PWM = 94
T max PWM = 101
minPWM = 15%
Это при росте температуры. А какая логика при спаде ?alex-spb wrote:Надо использовать ноги 5-6-7 как выходы на которых при достижении определенной темпиратуры будет лог."1"на 1 сек.Т.Е. +10С-5 нога-(1)-1сек. +14С-6 нога-(1)-1сек.+16С- 7 нога-(1)-1сек.