[ARM]
PWM (Pluse width Modulation)
3.3v 에서 100% 로 1초 동안 동작을 하는 모터가 있다면 0 과 1을 50% , 50% 로 나누게 되면 하나의 동작 시간은 0.5 초가 된다.
이것은 1.65v 를 1초 동안 동작 시킨것과 같은 것이된다.
가로인 펄스폭을 가지고 전력 제어가 가능하게된다.
타이머 / 카운터 에서보면
카운터는 카운터로써의 동작을 하지만 내부클럭을 사용할 시에는 타이머/카운터라고 한다.
하지만 외부 클럭이 들어오게되면 카운터의 기능 밖에 할 수 가 없다.
모두 4채널의 PWM 제어기가 있는데 각 채널은 서로 독립적으로 클록 입력을 받아 동작하며 주기 듀티 사이클 출력 파형 극성을 선택적 제어가능
PWM 제어기는 기본적으로 클록이 공급되지 않은 상태에 있으므로 이를 사용하려면 먼저 전력관리 제어가 PMC 에서 클록 공급을 하여야한다.
PWM 제어기는 클록 발생기와 4개의 채널로 구성된다. 클록 발생기는 마서트 클록 MCK 를 사용하여 13가지 의 클록을 PWM 제어기에 공급한다.
각 채널은 독립적으로 이 클록 중에서 1가지를 선택하여 PWM 출력 을 발생하는데 사용할 수 있다.
클록 발생기는 마스터클록 MCK를 위 그럼처럼 1부터 1024 까지 11가지 중에서 하나를 택하여 사용하면된다.
clkA 와 clkB 는 위 11가지 클럭중 하나를 임의로 선택하여 다시 1~255까지 분주 시켜 출력 신호를 발생한다.
PWM 제어기의 각 채널은 위 그럼과 같이 클록 선택부 , 카운터 , 비교기 등으로 구성되어 있다.
[빛 센서와 LED 를 가지고 빛에 따라 LED 깜박이기]
1: int main(void) 2: { 3: ALL_INIT(); 4: unsigned int iCnt1; 5: unsigned int iCnt2; 6: volatile unsigned int STP; 7: 8: 9: while(1) 10: { 11: 12: iCnt1= ADC_LEDRUN7(); 13: 14: if( (400 <iCnt1)&&(iCnt1< 800)) 15: { 16: iCnt2 = (iCnt1/100)*10000; 17: 18: for(STP = 0; STP < iCnt2; STP++); 19: 20: 21: LED_TOGGLE(); 22: } 23: else if(iCnt1 <= 400) 24: { 25: PIO_CODR=1 << LED_PIN; 26: } 27: else 28: { 29: PIO_SODR=1 << LED_PIN; 30: } 31: } 32: return 0; 33: } |
빛 센서의 값이 형광등이 켜져 있을시 800 ~ 900 이상으로 나오게 되었습니다.
그래서 800 이상 은 LED 가 꺼져있도록 설정하였습니다.
LED 가 깜빡이는 시작은 빛센서의 값이 800 미만으로 하였고 빛 센서가 깜빡이다가 400 정도 까지 내려가면
LED 에 불이 계속 켜져 있도록 설정하였습니다.
LED 가 젤처음 깜빡이기 시작할떄 의 딜레이는 for 문을 70000 번 도는 것이 되는데
for 문을 1000000 번 돌때 1초라 가정하면 이시간은
0.07초 마다 LED 토글이 됩니다.
빛의 센서값이 100씩 작아 질때마다 0.01초씩 딜레이 시간이 감소하게 됩니다.
[WIN_API]
[라디오 버튼]
라디오 버튼도 일종의 버튼이다.
“button” 클래스 에 BS_RADIOBUTTON , BS_AUTORADIOBUTTON 둘 중 하나의 스타일 을 지정하면 라디오 버튼이 된다.
체크 박스와 마찬가지로 수동 , 자동 두 가지 종류가 있는데 라디오 버튼이 체크 상태를 스스로 변경하는 가 그렇지 않은가의 차이가 있다.
체크 버튼은 진위적인 옵션을 개별적으로 입력 받는데 비해 라이도 버튼은 여러가지 선택 사항중 한가지만 선택 할 필요가 있을때 사용한다.
그래서 하나의 선택 사항에 대해 여러개의 라디오 버튼들이 그룹을 이루어 사용된다는 특징이 있다.
사용자에 의해 하나의 라디오 버튼이 선택이 되면 같은 그룹에 속한 다른 모든 라디오 버튼은 선택 해제가 된다.
라디오 버튼의 구성은 간단하다.
그룹을 이루는 첫번쨰 라디오 버튼에만 WS_GROUP 스타일을 주고 나머지 라디오 버튼은 WS_GROUP 스타일을 주지 않으면 된다.
최초로 WS_GROUP 을 가지는 라디오 버튼 부터 다음 WS_GROUP 스타일을 가지는 라디오 버튼 까지가 한 그룹이 된다.
[라디오 버튼 예제]
1: HDC hdc; 2: PAINTSTRUCT ps; 3: HBRUSH MyBrush , OldBrush; 4: enum {ID_R1 = 101 , ID_R2 , ID_R3 , ID_R4 , ID_R5 , ID_R6}; 5: HWND r1 , r2 , r3 , r4 , r5 , r6; 6: int GRAPH = 0; 7: COLORREF COLOR = RGB(0,0,0); 8: 9: 10: LRESULT OnCreate(HWND hWnd , WPARAM wParam, LPARAM lParam) 11: { 12: CreateWindow("button","Graph",WS_CHILD | WS_VISIBLE | 13: BS_GROUPBOX,5,5,120,110,hWnd,(HMENU)0,g_hInst,NULL); 14: CreateWindow("button","Color",WS_CHILD | WS_VISIBLE | 15: BS_GROUPBOX,145,5,120,110,hWnd,(HMENU)1,g_hInst,NULL); 16: r1=CreateWindow("button","Rectangle",WS_CHILD | WS_VISIBLE | 17: BS_AUTORADIOBUTTON | WS_GROUP, 18: 10,20,100,30,hWnd,(HMENU)ID_R1,g_hInst,NULL); 19: r2=CreateWindow("button","Ellipse",WS_CHILD | WS_VISIBLE | 20: BS_AUTORADIOBUTTON, 21: 10,50,100,30,hWnd,(HMENU)ID_R2,g_hInst,NULL); 22: r3=CreateWindow("button","Line",WS_CHILD | WS_VISIBLE | 23: BS_AUTORADIOBUTTON, 24: 10,80,100,30,hWnd,(HMENU)ID_R3,g_hInst,NULL); 25: r4=CreateWindow("button","Black",WS_CHILD | WS_VISIBLE | 26: BS_AUTORADIOBUTTON | WS_GROUP, 27: 150,20,100,30,hWnd,(HMENU)ID_R4,g_hInst,NULL); 28: r5=CreateWindow("button","Red",WS_CHILD | WS_VISIBLE | 29: BS_AUTORADIOBUTTON, 30: 150,50,100,30,hWnd,(HMENU)ID_R5,g_hInst,NULL); 31: r6=CreateWindow("button","Blue",WS_CHILD | WS_VISIBLE | 32: BS_AUTORADIOBUTTON, 33: 150,80,100,30,hWnd,(HMENU)ID_R6,g_hInst,NULL); 34: CheckRadioButton(hWnd, ID_R1, ID_R3, ID_R1); 35: CheckRadioButton(hWnd, ID_R4, ID_R6, ID_R4); 36: 37: return 0; 38: } 39: LRESULT OnCommand(HWND hWnd , WPARAM wParam, LPARAM lParam) 40: { 41: switch(LOWORD(wParam)) { 42: case ID_R1: 43: GRAPH=0; 44: break; 45: case ID_R2: 46: GRAPH=1; 47: break; 48: case ID_R3: 49: GRAPH=2; 50: break; 51: case ID_R4: 52: COLOR=0; 53: break; 54: case ID_R5: 55: COLOR=1; 56: break; 57: case ID_R6: 58: COLOR=2; 59: break; 60: } 61: InvalidateRect(hWnd, NULL, TRUE); 62: return 0; 63: } 64: LRESULT OnPaint(HWND hWnd , WPARAM wParam, LPARAM lParam) 65: { 66: hdc=BeginPaint(hWnd,&ps); 67: switch (COLOR) { 68: case 0: 69: MyBrush=CreateSolidBrush(RGB(0,0,0)); 70: break; 71: case 1: 72: MyBrush=CreateSolidBrush(RGB(255,0,0)); 73: break; 74: case 2: 75: MyBrush=CreateSolidBrush(RGB(0,0,255)); 76: break; 77: } 78: OldBrush=(HBRUSH)SelectObject(hdc,MyBrush); 79: switch (GRAPH) { 80: case 0: 81: Rectangle(hdc,10,200,200,300); 82: break; 83: case 1: 84: Ellipse(hdc,10,200,200,300); 85: break; 86: case 2: 87: MoveToEx(hdc,10,200,NULL); 88: LineTo(hdc,200,300); 89: break; 90: } 91: SelectObject(hdc,OldBrush); 92: DeleteObject(MyBrush); 93: EndPaint(hWnd,&ps); 94: 95: return 0; 96: 97: } |
두 개의 전역 변수 GRAPH와 COLOR가 선언되어 있으며 이 변수들이 현재 선택된 옵션값을 가지고
WM_PAINT는 이 변수값을 참고하여 도형을 그린다.
WM_CREATE에서 두 개의 그룹과 여섯개의 라디오 버튼을 생성시키고 있다.
두 그룹의 선두에 있는 r1, r4 라디오 버튼에 WS_GROUP 스타일이 설정되어 있음을 주의하도록 하자.
버튼들을 만든 후 CheckRadioButton 함수를 호출하여 처음 선택될 라디오 버튼을 지정한다.
1: BOOL CheckRadioButton( HWND hDlg, int nIDFirstButton, int nIDLastButton, int nIDCheckButton ); |
첫번째 인수는 라디오 버튼을 가지는 부모 윈도우(또는 대화상자)의 핸들이며 두번째와 세번째 인수는 각각 그룹의 시작 버튼과 끝 버튼이다.
네번째 인수로 선택될 버튼의 ID를 준다.
Create Window 에서 BS_GROUPBOX 를 이용하여 그룹박스를 만들고
WS_GROUP 을 이용하여 라디오 버튼 그룹을 만들것을 알수가 있다.
WM_CREATE 에서 다만들어지고나면 WM_COMMAND 로 넘어와서 해당되는 CASE 문 을 실행하고 break 를 통해
InvalidateRect(hWnd , NULL , TRUE); 로 가게된다.
가게되면 여기서 WM_PAINT 쪽으로 넘어가게된다.
그러면 COMMAND 에서 선택된 색깔을 가지고 사각형 ,원,선 중 한가지를 그리게된다.
[결과]
'코스웨어 > 11년 내장형하드웨어' 카테고리의 다른 글
잠깐 내려 놓는 시간.. (7) | 2011.09.27 |
---|---|
[내장형]윤병도_20110926일일보고서 (18) | 2011.09.26 |
[내장형]공정우_2011.9.23 윈 API 보고서 (정우) (15) | 2011.09.24 |
[내장형]이영진_2011년 9월 22일 일일보고서 (11) | 2011.09.22 |
[내장형]박춘우_2011년 9월 20일 화요일 Daily Report (26) | 2011.09.21 |
[내장형]한원우_9월19일 보고서 (36) | 2011.09.20 |
[내장형]이동현_0916일일보고서 (23) | 2011.09.17 |
9월 15일 일일보고서-[내장형]김정우 (19) | 2011.09.15 |