피곤해서 누웠는데 창문으로 밝은 빛이...★...ㅠㅠ
블라인드 내리기 귀찮아서 언제 전동블라인드 만들어야지... 생각만 하다가 휴일이 된 김에 만들었네요~
블라인드 제조사는 기억이 안납니다.. 뒤지면 나올텐데.. 뭐 다들 비슷할거라 생각해서 PASS하고..
사용한 부품은 아래와 같습니다.
스테핑 모터 : 17HS4401 (토크 : 40N.cm 으로써 토크가 큰걸 골랐습니다. (블라인드 무거움..))
모터 드라이버 : DRV8825 모듈 (vref=0.7V 으로써 current limit를 1.4A으로 정했습니다.)
제어 : Arduino Pro mini
릴레이모듈(필요없지만.. 혹시나 해서 보호회로 구현하려고 넣음.. FET가 없어서 그렇지 그냥 FET쓰거나
모터드라이브 Shutdown하는게 더 나아요...)
누워서 블라인드 내리는것도 안되고.. (짦음..) 뭐 나중에 원격으로 제어할 수 있게 해야죠 뭐..
근데.. 언제할지...ㅋㅋ 걍 전선 길게 늘려서 스위치를 머리맡으로 할거같음..
소스... (원래 소스는 아니고 지금 수정중인건데 아직 적용은 못해봄.. 처음에는 낮은 속도(주파수)로써 높은 토크로 동작하고 서서히 속도를 올려갑니다.)
/*
* BlindMotorController.c
*
* Created: 2019-06-05 오후 11:27:21
* Author : jichan
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 8000000
#include <util/delay.h>
static volatile unsigned int pwm_step = 0;
static volatile unsigned char pwm_step_ms = 0;
static void updatePwm() {
uint8_t icr_val = 249 - pwm_step;
ICR1H = 0x00;
ICR1L = icr_val;
OCR1AH = 0x00;
OCR1AL = icr_val / 2;
}
ISR(TIMER1_OVF_vect)
{
if(pwm_step_ms < 16)
pwm_step_ms++;
else{
pwm_step_ms = 0;
if(pwm_step < 125)
{
pwm_step++;
updatePwm();
}
}
}
int main()
{
unsigned char sw_state = 0;
// 1 PD0 : RXD
// 0 PD1 : TXD
// 1 PD2 : SW1
// 1 PD3 : SW2
// 1 PD4 : X
// 0 PD5 : OUT
// 0 PD6 : OUT (En, Active Low)
// 0 PD7 : OUT (DIR)
// PB1,PB2 : OUT
DDRD = 0xF2;
PORTD = 0xFF;
DDRB = 0x02; // PB1 OUT
PORTB = 0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Non-Inverted PWM
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 0.2 ms
// Output Pulse(s):
// OC1A Period: 0.2 ms Width: 0.1005 ms [199,100]
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0;
ICR1L=0;
OCR1AH=0;
OCR1AL=0;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=(0<<EXCLK) | (0<<AS2);
TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (0<<WGM20);
TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (1<<TOIE1);
// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (0<<TOIE2);
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
EIMSK=(0<<INT1) | (0<<INT0);
PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);
// USART initialization
// USART disabled
UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (0<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
ADCSRB=(0<<ACME);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR1=(0<<AIN0D) | (0<<AIN1D);
// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
sei();
while(1) {
unsigned char cur_sw_state;
if((PIND & 0x04) == 0)
{
cur_sw_state = 1;
}
else if((PIND & 0x08) == 0)
{
cur_sw_state = 2;
}else{
cur_sw_state = 0;
}
if(cur_sw_state != sw_state)
{
pwm_step = 0;
pwm_step_ms = 0;
updatePwm();
TCNT1H=0x00;
TCNT1L=0x00;
switch(cur_sw_state)
{
case 1:
PORTD &= ~0x40;
PORTD |= 0x80;
break;
case 2:
PORTD &= ~0xC0;
break;
default:
PORTD |= 0x40;
}
_delay_ms(125);
}
sw_state = cur_sw_state;
}
}
반응형
'일상 > 일상' 카테고리의 다른 글
[치질 치료 후기] 2. 수술 & 1일차 (0) | 2022.05.19 |
---|---|
[치질 치료 후기] 1. 진료 (0) | 2022.05.09 |
[영화] God's Not Dead - 신은 죽지 않았다 (0) | 2015.09.19 |
리눅스 마스터 1급 1차 봤습니다. (0) | 2015.07.31 |
크리스찬이 제사음식을 먹어도 될까요?... (0) | 2015.07.31 |
댓글