글
11
코드는 ARM7으로 작성하였고, 서보모터를 통해 좌측 최대, 가운데, 우측 최대를 결정하게 하였음~_~;;
어려움을 겪었던 원인은 PWM에 대해 잘 몰랐고 계산식을 잘못 적었던 것이다. 그리고 서보모터 주기를 20ms 보다는 2ms로 하는게 낫다는 것도 몰랐고...
//model HS-7966HB
//MCK -> 48MHz
//PWM_pin ->
//survo motor 주기: 2ms =(N*CPRD)/MCK (N=16,CPRD=6000) 주기는 20ms가 아니다.
#include "AT91SAM7X256.h"
#include "lib_AT91SAM7X256.h"
#include "OK7S256gcc.h"
#define PWM (1<<10)
#define Prescale_16 (1<<2) //16분주
#define CHID0 (1<<0)
#define PID3 (1<<3)
#define DIV_A (1<<1) // DIV_A와 DIV_B는 정교하게 할 때만 쓰는거다.
#define DIV_B (1<<16)//
#define Prescale_1 (1<<10)
#define Prescale_2 (1<<26)
void init_PWM(void)
{
*AT91C_PMC_PCER = (PID3 | PWM);//PIOB,PWM 클럭 허용
*AT91C_PIOB_PDR = (PB19);//주변장치롤 사용
// *AT91C_PWMC_MR = Prescale_1|Prescale_2|DIV_A|DIV_B; 이건 세부조정이라 안쓴다.
*AT91C_PWMC_CH0_CMR = Prescale_16;//분주비: MCK/16
*AT91C_PWMC_CH0_CPRDR = 6000;//주기 20ms
*AT91C_PWMC_CH0_CDTYR = 4200;//0.6ms
*AT91C_PWMC_ENA = CHID0;//PWM ch0 허용
}
void main(void)
{
init_PWM();
//2700->90씩 움직임. == 1350->45도
//58200 -> -90도
//55500;//1.5ms 0도
//52800;//2.4ms 90도
*AT91C_PMC_PCER = Prescale_16; // PIOA A켜겠다
*AT91C_PIOA_PER = (PA8)|(PA9); //LED 두핀의 기능을 입출력 여부시킨다.
*AT91C_PIOA_OER = (PA8)|(PA9); // LED 두 핀 입력할지 출력할지 결정
while(1){
*AT91C_PIOA_SODR = (PA8); // p.119 두 핀에 1을 넣는다 (LED 켠다!)
Delay_ms(2000);
*AT91C_PWMC_CH0_CUPDR = 800;//1.5ms
Delay_ms(2000);
*AT91C_PIOA_CODR = (PA8); // p.120 해당비트 클리어 = 0
*AT91C_PWMC_CH0_CUPDR = 1900;
*AT91C_PIOA_SODR = (PA9); // p.119 두 핀에 1을 넣는다 (LED 켠다!)
*AT91C_PIOA_CODR = (PA8);
Delay_ms(2000);
*AT91C_PWMC_CH0_CUPDR = 3000;//
Delay_ms(2000);
}
return 0;
}
아래는 작동영상~~
'●프로젝트와 세미나 > 키넥트 자동차 조종 프로젝트' 카테고리의 다른 글
라즈베리파이 이용 자동차 참고자료. (0) | 2013.09.10 |
---|---|
서보용 글리치 필터 회로도 (0) | 2013.08.13 |
라즈베리파이 관련 RC카 제작정보 (0) | 2013.08.12 |