최종 정리한 겁니다.
1.. 첫 번째 방식 == 계산공식 적용 해서 하는 방법
TIM4 Ch1 == PWM Out
딜레이는 Tick Time에서 했습니다.
// 50hz = 20mS
// angle max data = 240 = max pulse duty = 2.4ms = 180 deg
// angle min data = 60 == min pulse duty = 0.6ms = 0 deg
// angle == 원하는 각도
uint8_t deg[] = {0, 90, 180, 120, 60, 180};
pwm_pulse = ((angle * (240-60))/180.0) + 60;
1. 소스코드
#define TIM4_PWM_ch1_ON HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1)
#define TIM4_PWM_ch1_OFF HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1)
uint8_t deg[] = {0, 90, 180, 120, 60, 180};
uint16_t rg, t_loop = 0, pwm_pulse = 0, dg;
uint8_t cnt = 0, flag = 0;
void m_servo(float angle)
{
// 50hz = 20mS
// angle max data = 240 = max pulse duty = 2.4ms = 180 deg
// angle min data = 60 == min pulse duty = 0.6ms = 0 deg
pwm_pulse = ((angle * (240-60))/180.0) + 60;
TIM4 -> CCR1 = pwm_pulse;
}
void my_time()
{
t_loop++;
if(t_loop > 1000)
{
t_loop = 0;
flag = 1;
cnt++;
if(cnt >= 7) cnt = 0;
}
}
int main(void)
{
TIM4_PWM_ch1_ON;
while (1)
{
if(flag == 1){
flag = 0;
dg = deg[cnt];
m_servo(dg);
printf("%d\r\n",cnt);
}
}
2. CubeMX 설정
SYS CLK = 32MHZ
Prescaler = 160-1 ==>> 프리;스케일러 값
Counter Period = 2000-1