문서 검색 결과(4)
-
[재테크] 3월 3일은 나도 불기둥!
■친애하는 버핏옹께서 주주님들에게 친히 서한을 보내셨습니다."늬들이 미장을 알어? 절대로 미국과 반대로 투자하지마셔 들! "그러하다. 주접떨던 좁문가들이 유튜브와 기성언론들에 나와서 미국체 금리상승과 인플레이션을 들먹이며 공포감 조장하며, 투매를 이끌었는데, 결과론적으로 이들은 밑에서 아가리 벌린꼴이 아니겠는가… 반성하고 주접들 그만 떨고 절필하라. 그동안 부정적인 의견으로 일관하던 세계적 기관들은 3월1일 월요일부로 제롬 파월 의장의 말을 따랐습니다. "누가 금리가 올랐다고 소리를 내었는가? 짐이 그놈을 관심법으로 봐주가서~ 그놈에 주접들 떨지말거라! 마구니다~ 물가와 고용을 보아라! 금리 오른다는 헛서리는 네넘들이 짐에 자리에 앉았을때 하여라! 앞으로도 미장에서 주접떨면 짐이 그놈을 관심법으로 봐주가서!" 파월옹이 이렇게 한마디하고 책상을 탁!치니, 엌!하고 미장은 떡상했고, 금리는 자빠졌고, 달러는 강려크 해졌으며, 비트코인은 뭐지? 하며 오릅니다. 월가의 프로그램마저도… 그래도 못미더우신건지 다시한번 쐬기를 박으실겁니다. 파월 의장이 이번주 3월 4일 월스트리트저널(WSJ)이 주최하는 행사에서 미국 경제를 주제로 열설에 나설 예정입니다. 이에 앞서 지역 연방은행총재 토마스 바킨 리치몬드 연방은행 총재가 블룸버그 TV에 출연했습니다. 바킨 총재는 “미국 경제 전망과 관련된 부정적 위험이 감소했다”고 말했습니다.코로나백신 보급과 정부의 추가 재정지원, 그리고 앞으로 더 많은 지원이 이뤄질 것이라면서 경제가 회복 과정에서 어려움에 빠질 위험을 축소했다고 좁문가들 입을 틀어막았습니다. 바킨은 금융시장에도 팁을 줬습니다. 연준이 ‘언제(when)’ 통화정책을 바꿀 것인가에 너무 포커스를 맞추지 말고, 경제지표가 ‘어떻게(how)’ 나오는지 보라"고 했습니다. ■현대차, '상사 괴롭힘 논란 자살사망 직원' 유족에 산업재해 소송당할 위기??? 누가 위기인가?지난해 '직장 내 괴롭힘'으로 자살한 현대자동차 디자인센터 직원의 유족 측이 근로복지공단에 산업재해를 신청할 예정입니다. 인포스탁데일리에 따르면 유족 측은 해당 직원의 자살 원인으로 디자인센터 내 과도한 업무와 실적압박, 폭언, 따돌림에 의한 산업재해를 주장한 것으로 확인됐습니다. 그러나 현대차는 유족 측 입장을 받아들이지 않고 있습니다. 네... 받아들이시고요. 네~다음 ▲코스피 미장 떡상에 1% 상승 3043.87 마감 오늘 코스피지수는 전 거래일보다 1.03% 오른 3043.87에 마감, 코스닥지수는 1.01% 상승한 923.17에 마감. 원달러 환율은 0.5원 오른 1124.0원에 거래를 마쳤습니다. ▲中에 밀린 韓배터리 3사 '시장 전략 새롭게 정비해야'올해 1월 판매된 글로벌 전기차에 쓰인 배터리 사용량 순위에서 중국 업체들의 성장세가 두드러졌습니다. 중국 전기차 시장의 확대에 힘입은 CATL은 1위로 올라섰습니다. LG에너지솔루션, 삼성 SDI, SK이노베이션 국내 배터리 제조 3사는 모두 상위 10위 안에 들었습니다.됬고요, 테슬라 catl밧데리써서 지금 조뙸습니다. Lg꺼 쓸껄… ▲SK이노 "3조원 더 투자"…바이든에 '배터리 SOS'SK이노베이션이 ‘전기차 배터리 수입 금지’를 골자로 한 미국 국제무역위원회(ITC) 최종 판결에 백악관이 개입해줄 것을 요청했습니다. LG에너지솔루션과의 배터리 분쟁 결과가 총 5조원이 넘는 SK이노베이션의 미국 조지아주 투자와 일자리 창출에 부정적 영향을 미칠 수 있다는 우려를 미국 무역대표부(USTR)에 전달한 것으로 알려졌습니다. 그레이트 아메리카를 상대로 협박하는 우리나라의 기업이 갑자기 위대해 보이네요. 죽빵을 맞을지, 협박이 통할지는 지캬봐야겠지만 저라면 죽빵을 날릴거에요. 그것도 강냉이부위로. ▲LG이노텍, 세계 최초 ‘차량용 와이파이6E 모듈’ 개발LG이노텍은 세계 최초로 차세대 와이파이 기술을 적용한 ‘차량용 와이파이6E 모듈’을 개발했습니다. 기존 와이파이5 대비 3배 가량 빠른 데이터 전송 속도를 자랑합니다. 이번 개발로 LG이노텍은 일본 주도의 차량 통신모듈 시장에서 유리한 고지를 선점할 수 있게 됐습니다. 장담합니다만… 우리나라는 세계에서 첫번째로 스마트란말 이상의 혁신국가가 될것입니다. ▲"기업가치 올려라" SKT 박정호號, 4년 연속 임원 스톡옵션SK텔레콤이 4년 연속 임원들에게 주식매수선택권(스톡옵션)을 부여합니다. 책임 경영을 통해 중장기 기업 가치를 끌어올리기 위한 행보입니다. SK텔레콤은 기업 가치를 끌어올리겠다는 전략으로 원스토어 등 자회사 기업공개(IPO)에도 속도를 내고 있습니다. 임원들만 주고, 직원들은 안주니 들고 일어나죠. ▲외국인, SK 삼형제 1.5조 순매수외국인이 최근 한달 간 코스피·코스닥시장에서 8조원 넘게 순매도한 가운데 SK 계열사들에는 자금을 투입한 것으로 나타났습니다. 지난 한달 동안 외국인은 SK바이오팜, SK하이닉스, SK텔레콤 등에 1조5000억원 규모를 순매수했습니다. 응 더사~ ▲“아시아판 구글을 향해” 이해진-손정의 ‘초대형 빅테크’ 출항네이버와 소프트뱅크가 각자의 자회사인 ‘라인’과 ‘Z홀딩스’의 경영통합을 완료하고 합작법인을 출범했습니다. 수억명의 사용자를 거느린 야후재팬과 손을 잡은 만큼, 이번엔 구글과 맞먹는 글로벌 플랫폼을 탄생시킬 수 있을지 주목됩니다. 향후 5년간 5000억엔(한화 약 5조 3000억원)을 투자해 검색·포털, 광고, 메신저와 더불어 커머스, 로컬·버티컬, 핀테크, 공공 분야 등 다양한 사업에 집중합니다.하세요~ ▲쿠팡 공모희망가 주당 27~30달러..."기업가치 57조"한국 전자상거래 기업 쿠팡이 미국 뉴욕증시 상장으로 최대 36억달러(4조원)를 조달할 계획입니다. 주식 1억2000만주를 주당 27~30달러에 판다는 계획으로, 기업이 제시한 공모 희망가 상단을 기준으로 한 기업 가치는 510억달러(57조원)에 이릅니다. 누군가는 57조가 비싸다고하지만 … ▲삼성물산, 카타르서 1.8조 규모 LNG 프로젝트 수주삼성물산이 총 1조 8500억원 규모의 카타르 LNG 수출기지 건설공사를 단독으로 수주했습니다. 이번 프로젝트는 카타르 국영 석유회사(Qatar Petroleum)가 발주한 것으로 LNG 수출을 위한 저장탱크 등을 건설하는 사업입니다. 삼성물산은 "이번 수주를 통해 LNG 수입기지에 이어 수출기지 분야까지 사업영역을 확장하게 됐다"고 밝혔습니다.좋았다! ▲한양, 올해 연이은 수주 랠리…'태양광·주택' 1조 육박한양은 올해 들어 주택개발 분야와 에너지 분야에서 약 1조원에 육박하는 수주를 달성했다고 밝혔습니다. 한양은 지난달 약 1116억원 규모의 고흥만 수상태양광 EPC사업에 이어 천안, 향남, 아산 등 3개 현장에서 약 8141억원 규모의 주택사업 등 총 9257억원 규모의 사업을 잇따라 수주했습니다.여긴 한화빳따 ▲리모델링 봄바람 기대감…건설사들 수주 각축전 예고재건축 규제 강화에 건설사들이 중층단지 리모델링으로 눈을 돌리면서 올해 치열한 수주전을 예고하고 있습니다. 롯데건설은 서울 양천구 ‘목동2차 우성아파트 리모델링 사업’ 시공사로 선정됐습니다. HDC현대산업개발은 리모델링 전담 조직을 신설했습니다. ▲CJ대한통운, 美법인 'CJ로지스틱스'로 브랜드 통합CJ대한통운은 미국 통합법인 'CJ로지스틱스 아메리카'의 브랜드를 국내와 동일한 'CJ로지스틱스'로 변경하기로 했다고 밝혔습니다. CJ 브랜드 가치활용 제고를 통해 글로벌 마케팅을 본격화한다는 방침입니다. ▲GS리테일, ESG추진위 출범GS리테일이 ESG추진위원회를 출범해 ESG활동을 강화합니다. 위원장은 허연수 GS리테일 대표이사 부회장이 맡았습니다. GS리테일은 올해 ESG 활동 중점 추진을 통해 ESG 평가에서 종합 A등급을 받는 것을 목표. ■오늘 모니터앞에서 불현듯 드는 생각 □국장 떡상에 피로감이 사라지는 하루였습니다.짱공 재테크방 형들과 함께 정신없이 놀고있습니다. 일일히 카톡 대응하느라 제가 머리카락이 없어집니다만... 그래도 뭐, 보람찼습니다. 소소한 재미와 행복이군요. 인생은 외롭습니다. 늘 살붙이고 사는 사람이 있지만, 가끔씩 찾아오는 공허함. 즐거운 일상에서도 느껴지는 소외감. 누구에게나 친절한 사람이지만 말할수 없이 어느때고 무너지는 자존감. 한치 앞도 보이지 않는 일상속에서 불현듯 찾아오는 공포… 오세요. 친해지고 속내도 털고. 술주정도 받습니다. 누르세요~ 벌써 50명이 넘었네요... 으허~https://open.kakao.com/me/0umt 오늘의 결론은 서전기전, 쎄노텍, 특수건설, 하나기술, 케이엘넷,적당히들 드시길~ 이만~ 뭘보건 뭘듣건, 주식은 손가락 클릭한 사람이 책임집니다.1%수익에도 겸손과 감사를
-
-

[자유·수다] '백설기물만두'님 보세요. ATmega128을 이용한 예제 소스입니다.
댓글만 남기고 방금 집에 와서 예전 놀았던 소스들 뒤졌네요ㅋㅋㅋ인터넷에 글 잘 안남기지만 짱공유에서 도움받은 적이 있어서ㅋㅋㅋ서로 돕고 살아야죠 ㅋ질문 남기시면 자료 수정하며 올리겠습니다.오래전에 만들었던 장난감들이라 소스에 대한 자세한 설명은 일일히 기억이 안나네요 ㅠㅠ주석 처리 되고 마지막 수정이 어찌 된지 기억이 안나고 필요 없는 부분들(친구들 학번 등) 빼고 올리는거라 완벽한 코드는 아닙니다ㅋㅋㅋ학부 2학년 아무것도 모를 때 짰던 것도 있어서 지금보면 수정해야 할 것도 많을꺼 같네요.적당히 알아서 보세요 ㅋㅋㅋavr studio와 winavr을 이용하였습니다.//----------------------------- '백설기물만두' 님께서 하시려는 프로젝트(RC카 이용) ----------------------------//#include <avr/io.h>#include <avr/interrupt.h>#define F_CPU 16000000UL#include <util\delay.h>#define left 106 //106#define right 76 //76#define center 92 //92 대충 95#define CW 0x50#define CCW 0x90#define STOP 0x00volatile long servo = 0;volatile int DC = 0;void init_sys(){ DDRA = 0x01; DDRB = 0xf0; // 4:eneble, 5:DC Motor PWM, 6:Direction A, 7:Direction B DDRE = 0x0a; // 0:UART0 recive, 1:UART0 trans, 3:Servo PWM TCCR1A = 0x83; TCCR1B = 0x0d; TCCR3A = 0x83; TCCR3B = 0x0c; UCSR0B = 0xd8; //UCSR0B = 0x90; UCSR0C = 0x06; UBRR0H = 0; UBRR0L = 25; //38.4k spb SREG = 0x80;}int main(){ init_sys(); int i = 0; //servo = center; servo = 95;// servo = 80; while(1){ PORTA = 0x00;/* for(i = right; i < left; i ++){ OCR3AH = i>>8; OCR3AL = i; _delay_ms(7); } for(i = left; i > right; i --){ OCR3AH = i>>8; OCR3AL = i; _delay_ms(7); }*/// PORTB = (PORTB & 0x0f) | CW; //PORTB = (PORTB & 0x0f) | CCW;// OCR1AH = DC>>8;// OCR1AL = DC;// OCR3AH = servo>>8;// OCR3AL = servo; }// DC = 20;// servo = 100;// OCR3AH = servo>>8;// OCR3AL = servo;/* PORTB = (PORTB & 0x0f) | CW; OCR1AH = DC>>8; OCR1AL = DC; OCR3AH = servo>>8; OCR3AL = servo; _delay_ms(3000); DC = 10; servo = 25; PORTB = (PORTB & 0x0f) | CCW; OCR1AH = DC>>8; OCR1AL = DC; OCR3AH = servo>>8; OCR3AL = servo; _delay_ms(1000); DC = 10; servo = 16; PORTB = (PORTB & 0x0f) | CW; OCR1AH = DC>>8; OCR1AL = DC; OCR3AH = servo>>8; OCR3AL = servo; _delay_ms(5000); return 0;*/}ISR(SIG_UART0_RECV){ if(UDR0 == 'a'){ PORTA = 0x01; _delay_us(500); servo -= 1; if(servo < left) servo = left; } if(UDR0 == 'd'){ PORTA = 0x01; _delay_us(500); servo += 1; if(servo > right) servo = right; } if(UDR0 == 'w'){ PORTA = 0x01; _delay_us(500); DC += 5; if(DC > 100) DC = 100; } if(UDR0 == 's'){ PORTA = 0x01; _delay_us(500); DC -= 5; if(DC < 0) DC = 0; } if(UDR0 == 'q'){ PORTA = 0x01; _delay_us(500); PORTB = (PORTB & 0x0f) | STOP; DC = 0; }}//----------------------------- 간단한 라인트레이서 예제 (RC카 이용) -----------------------------//#include <avr/io.h>#define F_CPU 14740600UL#include <util\delay.h>#include <stdio.h>#define LINE1 0x80 //첫번째 라인 DDRAM address#define LINE2 0xC0 //두번째 라인 DDRAM address//PORTC0 = Enable, PORTC1 = R/W, PORTC1 = Register select, PORTA = Date#define CMD_WRITE 0x01 //E=1, RW=0, RS=0#define CMD_READ 0x03 //E=1, RW=1, RS=0#define DATA_WRITE 0x05 //E=1, RW=0, RS=1#define DATA_READ 0x07 //E=1, RW=1, RS=1#define LCD_EN 0x01 //enable 신호#define ADMUX_value 0xC0 //ADCMUX Register 변수#define center 300 //center 95,right = 80, left = 110volatile int ADC_high[8]={0,0,0,0,0,0,0,0};volatile int ADC_low[8]={1024,1024,1024,1024,1024,1024,1024,1024};void init_port(void){ DDRC = 0xFF; DDRA = 0xFF; DDRE = 0xFF; DDRF = 0x00; DDRG = 0x00;}void init_PWM(){ TCCR3A = 0xAB; // encoder input TCCR3B = 0x0C; OCR3A = 95; //servo OCR3B = 1022-100; //cw OCR3C = 1022; //ccw}//////////////////// ADC ////////////////////int run_ADC(int channel){ int value[8]; ADMUX = ADMUX_value + channel; _delay_us(200); ADCSRA = 0xAD; ADCSRA |= 0x40; while((ADCSRA&0x10)!=0x10) value[channel] = (int)ADCL + ((int)ADCH<<8); return value[channel];}void init_ADC_value(){ int i,value[8]; for(i=0;i<8;i++){ value[i]= run_ADC(i); if(ADC_high[i] <= value[i]) ADC_high[i] = value[i]; if(ADC_low[i] >= value[i]) ADC_low[i] = value[i]; }}int main(){ init_port(); init_LCD(); init_PWM(); unsigned int channel,min_channel[3]={3,3,3},aver,total_value,final_value=95; long ADC_value[8]; while(1){ if(PING&0x02){ init_ADC_value(); } else{ for(channel=0;channel<8;channel++){ for(aver=0;aver<5;aver++){ ADC_value[channel] = ADC_value[channel] + run_ADC(channel); } ADC_value[channel] = ADC_value[channel]/(aver); ADC_value[channel] = ((ADC_value[channel] - ADC_low[channel]) * 100 )/ (ADC_high[channel]-ADC_low[channel]); if(ADC_value[channel]<35){ min_channel[0] = channel; min_channel[1] = min_channel[0]; min_channel[2] = min_channel[1]; } if(ADC_value[channel]<3) ADC_value[channel]=0; if(ADC_value[channel]>97) ADC_value[channel]=100; } } switch(min_channel[0]){ case 0:{ final_value = center + 15 + (ADC_value[0]-ADC_value[1])/11.42; break; } case 1:{ if(ADC_value[0]>ADC_value[2]) final_value = center + 10 + (ADC_value[2]-ADC_value[1])/40; if(ADC_value[0]<ADC_value[2]) final_value = center + 10 + (ADC_value[1]-ADC_value[0])/11.42; break; } case 2:{ if(ADC_value[1]>ADC_value[3]) final_value = center + 7.5 + (ADC_value[3]-ADC_value[2])/40; if(ADC_value[1]<ADC_value[3]) final_value = center + 7.5 + (ADC_value[2]-ADC_value[1])/26.67; break; } case 3:{ if(ADC_value[2]>ADC_value[4]) final_value = center + 3.75 + (ADC_value[4]-ADC_value[3])/13.33; if(ADC_value[2]<ADC_value[4]) final_value = center + 3.75 + (ADC_value[3]-ADC_value[2])/26.67; break; } case 4:{ if(ADC_value[3]>ADC_value[5]) final_value = center - 3.75 + (ADC_value[5]-ADC_value[4])/13.33; if(ADC_value[3]<ADC_value[5]) final_value = center - 3.75 + (ADC_value[4]-ADC_value[3])/26.67; break; } case 5:{ if(ADC_value[4]>ADC_value[6]) final_value = center - 7.5 + (ADC_value[6]-ADC_value[5])/40; if(ADC_value[4]<ADC_value[6]) final_value = center - 7.5 + (ADC_value[5]-ADC_value[4])/26.67; break; } case 6:{ if(ADC_value[5]>ADC_value[7]) final_value = center - 10 + (ADC_value[7]-ADC_value[6])/11.42; if(ADC_value[5]<ADC_value[7]) final_value = center - 10 + (ADC_value[6]+ADC_value[5])/49; break; } case 7:{ final_value = center - 15 + (ADC_value[7]-ADC_value[6])/11.42; break; } } total_value = ADC_value[0] + ADC_value[1] + ADC_value[2] + ADC_value[3] + ADC_value[4] + ADC_value[5] + ADC_value[6] + ADC_value[7]; if(final_value<285) final_value = 285; if(final_value>315) final_value = 315; if(total_value>600){ if((min_channel[0]==0)|(min_channel[1]==0)|(min_channel[2]==0)) final_value = 315; else if((min_channel[0]==7)|(min_channel[1]==7)|(min_channel[2]==7)) final_value = 285; } OCR3A = final_value; }}//----------------------------- 간단한 모터 속도 제어 (PID 제어) -----------------------------//#include "간단한 모터 속도 제어.h"#include "LCD.h"#include "variable.c"void run_ADC();int main(){ init_DDR(); init_Timer(); init_ADC(); init_LCD(); while(1){// m_desire_spd = pressure/10; //아직 값 몰라 run_ADC(); OCR2 = 0; OCR0 = pressure/4; } return 0;}run_ADC(){ ADCSRA |= 0x40; while((ADCSRA&0x10)!=0x10) pressure = (int)ADCL + ((int)ADCH<<8);}#include <avr/io.h>#define F_CPU 16000000UL#include <util/delay.h> //delay.h 함수는 F_CPU는 (Clock 설정 뒤로 가야함)#include <avr/interrupt.h>#include "간단한 모터 속도 제어.h"void init_DDR(){ DDRA = 0xff; // LCD Instruction DDRB = 0x90; // PB4 = CW, PB7 = CCW DDRC = 0xff; // LCD Data // PD6 = Timer 1 Extern Clock, PF0 = ADC0 input, Timer0 = Calculation Frequency SREG = 0x80; // Global Interrupt Enable}void init_Timer(){ TCCR0 = 0x7f; // CW = Fast PWM, Campare match Set, 1024 Prescale TCCR1B = 0x06; // Encorder Counter = Extern Clock (Falling Edge) TCCR2 = 0x7d; // CCW = Fast PWM, Campare match Set, 1024 Prescale TIMSK = 0x21; // Timer0 Overflow interrupt Enable, Timer1 Overflow interrupt Enable}void init_ADC(){// ADCSRA = 0xef; // ADC Enable, Start Bit Set, Free Running Mode, Interrrupt Enable, 128 Prescale ADCSRA = 0xe7;}#include "간단한 모터 속도 제어.h"#include "variable.c"#include "PID_gain.h"#include "LCD.h"ISR(TIMER0_OVF_vect){ e_counter = (TCNT1H<<8) + TCNT1L; TCNT1H = 0; TCNT1L = 0; m_err_now = e_counter - (e_counter/10); //엔코더 변수도 몰라 m_sum_err += m_err_now; // OCR0 = PID_kp*(m_err_now) + PID_ki*(m_sum_err) + PID_kd*(m_err_now - m_err_past); m_err_past = m_err_now;}ISR(TIMER1_OVF_vect){ e_counter = (1<<16); //long 타입 몇까지 저장하는지 확인 안 해봤어~ㅋㅋㅋ}/*ISR(ADC_vect){ pressure = (ADCH<<8) + ADCL; LCD_wr_str(LINE1, pressure);}*/아래 define 3개는 'PID_gain.h' 입니다.#define PID_kp 1#define PID_ki 0#define PID_kd 0#include "간단한 모터 속도 제어.h"int m_err_past;int m_err_now;int m_sum_err;int m_desire_spd;int pressure;long e_counter;//----------------------------- 초음파 센서로 거리를 받아 스태핑 모터 구동로 위치 제어 (PID 제어) -----------------------------//#include <avr/io.h>#define F_CPU 16000000UL#include <util/delay.h>#include <avr/interrupt.h>#include <stdio.h>#include <string.h>#define LINE1 0x80 //첫번째 라인 DDRAM address#define LINE2 0xC0 //두번째 라인 DDRAM address//PORTB0 = Register select, PORTB1 = R/W, PORTB2 = Enable, PORTC = Date#define CMD_WRITE 0x04 // E=1, RW=0, RS=0#define CMD_READ 0x06 // E=1, RW=1, RS=0#define DATA_WRITE 0x05 // E=1, RW=0, RS=1#define DATA_READ 0x07 // E=1, RW=1, RS=1#define LCD_EN 0x04 // E=1, RW=0, RS=0int l_dis, r_dis;int l_m[] = {0x80, 0x40, 0x20, 0x10};int r_m[] = {0x01, 0x02, 0x04, 0x08};int l_cnt = 0, r_cnt = 0; int l_result, r_result;int l_error, l_error_i, l_error_d, pre_l_error;int r_error, r_error_i, r_error_d, pre_r_error;float kp = 1, ki ,kd = 0.035;char *str;void init_PORT(){ DDRA = 0xff; // Motor CW, CCW DDRB = 0x07; // LCD Cmd DDRC = 0xff; // LCD Data DDRF = 0x00; // 0:l_dis, 1:r_dis DDRG = 0x03; SREG = 0x80; // Global Interrupt Enable}void init_ADC(){ ADCSRA = 0xa5;}void init_timer(){ TCCR0 = 0x07; TIMSK = 0x01;}int conv_ADC(int channel){ int value[6]; ADMUX = channel; _delay_us(200); ADCSRA |= 0x40; while((ADCSRA&0x10) == 0) value[channel] = (int)ADCL + (long)(ADCH<<8); return value[channel];}void LCD_cmd_write(char cmd){ PORTB = CMD_WRITE; PORTC = cmd; PORTB = PORTB^LCD_EN; _delay_ms(2);}void LCD_data_write(char data){ PORTB = DATA_WRITE; PORTC = data; PORTB = PORTB^LCD_EN; _delay_ms(2);}void init_LCD(void){ _delay_ms(15); LCD_cmd_write(0x38); _delay_ms(5); LCD_cmd_write(0x38); _delay_us(100); LCD_cmd_write(0x38); LCD_cmd_write(0x08); LCD_cmd_write(0x01); LCD_cmd_write(0x06); LCD_cmd_write(0x0C);}void LCD_wr_str(char d_line, char *lcd_str){ LCD_cmd_write(d_line); while(*lcd_str != '\0') { LCD_data_write(*lcd_str); lcd_str++; }}int main(){ init_PORT(); init_ADC(); init_timer(); init_LCD(); while(1){ l_dis = conv_ADC(0); r_dis = conv_ADC(1); if(l_error<0) PORTG = 0x01; if(r_error<0) PORTG = PORTG | 0x02; sprintf(&str, "%d %d ", l_error, r_error); LCD_wr_str(LINE1, &str); sprintf(&str, "%d %d ", l_result, r_result); LCD_wr_str(LINE2, &str); PORTG = 0x00; }}ISR(TIMER0_OVF_vect){ r_error = 250 - r_dis; l_error = 250 - l_dis; l_error_i += l_error; r_error_i += r_error; l_error_d = l_error - pre_l_error; r_error_d = r_error - pre_r_error; l_result = kp * l_error + ki * l_error_i + kd * l_error_d; r_result = kp * r_error + ki * r_error_i + kd * r_error_d; if(l_error < 50 && l_error > -50) l_result = 0; else{ if(l_result > 0){ PORTA = l_m[l_cnt]; l_result = 7000 - l_result; if(l_result < 2000) l_result = 2000; _delay_us(l_result); l_cnt++; if(l_cnt > 3) l_cnt = 0; } else{ PORTA = l_m[l_cnt]; l_result = 7000 + l_result; if(l_result < 2000) l_result = 2000; _delay_us(l_result); l_cnt--; if(l_cnt < 0) l_cnt = 3; } } if(r_error < 50 && r_error > -50) r_result = 0; else{ if(r_result > 0){ PORTA = r_m[r_cnt]; r_result = 7000 - r_result; if(r_result < 2000) r_result = 2000; _delay_us(r_result); r_cnt++; if(r_cnt > 3) r_cnt = 0; } else{ PORTA = r_m[r_cnt]; r_result = 7000 + r_result; if(r_result < 2000) r_result = 2000; _delay_us(r_result); r_cnt--; if(r_cnt < 0) r_cnt = 3; } } pre_l_error = l_error_d; pre_r_error = r_error_d;}//----------------------------- 캐릭터 LCD (MCU를 사용하시면 변수 확인이 안됩니다. 확인 원할시 사용) -----------------------------//#include <avr/io.h>#define F_CPU 16000000UL#include <util\delay.h>#include <string.h>#define LINE1 0x80 //첫번째 라인 DDRAM address#define LINE2 0xC0 //두번째 라인 DDRAM address//PORTB0 = Register select, PORTB1 = R/W, PORTB2 = Enable, PORTC = Date#define CMD_WRITE 0x04 //E=1, RW=0, RS=0#define CMD_READ 0x06 //E=1, RW=1, RS=0#define DATA_WRITE 0x05 //E=1, RW=0, RS=1#define DATA_READ 0x07 //E=1, RW=1, RS=1#define LCD_EN 0x04 //E=1, RW=0, RS=0//////////////////// LCD ////////////////////void LCD_cmd_write(char cmd){ PORTB = CMD_WRITE; PORTC = cmd; PORTB = PORTB^LCD_EN; _delay_ms(2);}void LCD_data_write(char data){ PORTB = DATA_WRITE; PORTC = data; PORTB = PORTB^LCD_EN; _delay_ms(2);}void init_LCD(void){ _delay_ms(15); LCD_cmd_write(0x38); _delay_ms(5); LCD_cmd_write(0x38); _delay_us(100); LCD_cmd_write(0x38); LCD_cmd_write(0x08); LCD_cmd_write(0x01); LCD_cmd_write(0x06); LCD_cmd_write(0x0C);}void LCD_wr_str(char d_line, char *lcd_str){ LCD_cmd_write(d_line); while(*lcd_str != '\0') { LCD_data_write(*lcd_str); lcd_str++; }}void init_port(void){ DDRB = 0x07; DDRC = 0xFF;}int main(){ init_port(); init_LCD(); char *str; while(1){ sprintf(&str, "%d %d ", 'a', 1); LCD_wr_str(LINE1, &str); }}//----------------------------- 장난감 만들 때 사용 했던 간단한 digital filter -----------------------------//#include "two_wheel_balancing.h"// 필터링할 항목마다 value[8]에 관한 변수 선언 할것float mov_aver_filter(float pre_aver,int value[8], int input){ int cnt; float aver; value[0] = input; for(cnt = 1; cnt < 7; cnt ++) value[cnt+1] = value[cnt]; aver = pre_aver + ((input - value[7]) >> 3); return aver;}// alpha = 가중치 (항상 1 이하, 클수록 현재값 치중)int low_pass_filter(int pre_aver, int input, float alpha){ int aver; aver = alpha * pre_aver + (1- alpha) * input; return aver;}int high_pass_filter(int pre_aver, int pre_input, int input, float alpha){ int aver; aver = alpha * pre_aver + alpha * (input - pre_input); return aver;}제가 그림 그리는 재주가 없어서 ㅋㅋㅋ 대충 보시면 이해하실꺼에요ㅋㅋㅋDC 모터로 구동, 서보 모터로 조향 예 입니다.컴퓨터 → (UART) → 무선 통신 모듈(지그비or 블루투스) | | (무선 통신) ↓ 무선 통신 모듈(지그비or 블루투스) → (UART) → MCU → (PWM) → 조향 모터 ↓ (PWM) ↓ 구동 모터이런 느낌이 될꺼에요.이 정도 자료면 충분히 성공 하실 수 있을꺼에요.공대 화이팅입니다 ㅋ
-
문서 더보기 >