CCR1 extern int8_t servoDirec; extern int8_t servoPos; extern int8_t servoEnabled; void servoInit(); void servoMove(uint8_t mode, uint8_t pos); #endif /* INC_SERVO_H_ */"> CCR1 extern int8_t servoDirec; extern int8_t servoPos; extern int8_t servoEnabled; void servoInit(); void servoMove(uint8_t mode, uint8_t pos); #endif /* INC_SERVO_H_ */"> CCR1 extern int8_t servoDirec; extern int8_t servoPos; extern int8_t servoEnabled; void servoInit(); void servoMove(uint8_t mode, uint8_t pos); #endif /* INC_SERVO_H_ */">
#ifndef INC_SERVO_H_
#define INC_SERVO_H_
#include "main.h"
#include "delay_us.h"
// Servo 연결 Timer Channel CCR
#define SERVO_CCR TIM3->CCR1
extern int8_t servoDirec;
extern int8_t servoPos;
extern int8_t servoEnabled;
void servoInit();
void servoMove(uint8_t mode, uint8_t pos);
#endif /* INC_SERVO_H_ */
// servo.c
#include "servo.h"
int8_t servoDirec;
int8_t servoPos;
int8_t servoEnabled;
void servoInit() {
servoDirec = 0;
servoPos = 30;
servoEnabled = 1;
SERVO_CCR = servoPos;
}
// Servo 동작 함수, mode 0 범위내 위치 이동 / 1 왕복 / 2 1번 왕복 / 3 제한 없이 위치 이동
void servoMove(uint8_t mode, uint8_t pos) {
if (servoEnabled == 1) {
switch (mode) {
case 0:
if (pos <= 30) {
pos = 30;
}
else if(pos >= 120) {
pos = 120;
}
if (servoPos < pos) {
servoPos++;
}
else if (servoPos > pos) {
servoPos--;
}
break;
case 1:
if (servoPos <= 30) {
servoDirec = 1;
}
else if (servoPos >= 120) {
servoDirec = 0;
}
if (servoDirec == 0) {
servoPos--;
}
else if (servoDirec == 1) {
servoPos++;
}
break;
case 2:
if (servoPos <= 120) {
servoPos++;
}
else if (servoPos >= 30) {
servoPos--;
if (servoPos == 30) {
servoEnabled = 0;
}
}
break;
case 3:
if (servoPos < pos) {
servoPos++;
}
else if (servoPos > pos) {
servoPos--;
}
break;
}
}
else if (servoEnabled == 0) { // Servo 동작 정지 상태 Code 위치
}
SERVO_CCR = servoPos; // Servo 위치 조정
}