일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 카운터
- 펌웨어
- 레지스터슬라이스
- stepmotor
- 임베디드시스템
- ERROR RESPONSE
- Low-power Interface
- AMBA
- Interoperability
- STM32
- 구조적모델링
- cacheable
- AXI3
- atomic access
- ABMA
- T flip flop
- Multiple transaction
- ordering model
- AXI4
- APB3
- FPGA
- SoC
- 스텝모터
- tff
- QoS
- Verilog
- single copy atomic size
- FGPA #반도체설계 #verilog #시프트레지스터 #uart
- Multiple outstanding
- out-of-order
Archives
- Today
- Total
CHIP KIDD
[ARM] 엘레베이터 프로젝트- Step Motor 회전속도 및 방향 제어 본문
STM32F411RE : ARM 코어중 Cortex M4를 사용하였습니다.
현장에서는 Cortex M3(STM32F103계열)를 많이 사용함 : 가성비가 좋다. 싸고 고성능. 사용하는 사람이 많다(자료많음).
M4와 M3의 차이점은 FPU유무이다. M4는 FPU를 제공하기 때문에, 곱셈, 나눗셈, 소수점 연산이 더 빠르게 해준다.
컴파일러 Tool 로써 STM 사에서 제공하는 IDE Cube를 이용하여 컴파일 합니다. ( 많이 사용하는 tool로 Keil, IAR이 있습니다.)
*CubeMX는 초기화 코드를 생성하는 tool입니다.
이번 실습에서 제가 구현하고자 하는 것은 Step 모터와 버튼을 이용하여 스텝모터의 회전속도와 방향을 제어하고자 합니다.
버튼 1번 : On / Off
버튼 2번 : 방향 변경
버튼 3번 : 회전 속도 UP
버튼 4번 : 회전 속도 Down
또한 회전속도는 ,Polling 방식이 아닌 Interrupt를 이용하여 제어하였습니다.
사실, 메인함수에는 간단하게 구동 함수만 놓고, 모듈별로 폴더를 따로빼어 (전체를 제어하는 컨트롤러 폴더) 코딩하는게 적절하나, 이번에는 첫 시간이기도 하고, 제어할게 별로없기 때문에 메인함수에 전부를 넣었습니다.
1. Step Motor 구현 코드
스텝모터는 자석에 전류를 넣어주는 (여자)방향에 의해 회전이 동작합니다.
2. Interrupt 코드
enum{S_STEP_MOTOR_IDLE, S_STEP_MOTOR_CW, S_STEP_MOTOR_CCW};
uint8_t stepMotorState;
uint8_t stepMotorDirection;
void setstepMotorState(uint8_t state)
{
stepMotorState = state;
}
uint8_t getstepMotorState()
{
return stepMotorState;
}
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim -> Instance == TIM3){
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
stepMotorRun(stepMotorDirection);
}
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
setstepMotorState(S_STEP_MOTOR_IDLE);
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */
//uint8_t stepMotorState = S_STEP_MOTOR_IDLE;
StepMotorInit(&htim3);
//HAL_TIM_Base_Start_IT(&htim3);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
static uint16_t speed = 100;
StepMotorSpeed(speed);
switch (stepMotorState)
{
case S_STEP_MOTOR_IDLE:
HAL_TIM_Base_Stop_IT(&htim3);
if(getButtonState(&btnStart)) setstepMotorState(S_STEP_MOTOR_CW);
break;
case S_STEP_MOTOR_CW:
stepMotorDirection = STEP_MOTOR_DIR_CW;
HAL_TIM_Base_Start_IT(&htim3);
if(getButtonState(&btnStart)) setstepMotorState(S_STEP_MOTOR_IDLE);
else if(getButtonState(&btnDir)) setstepMotorState(S_STEP_MOTOR_CCW);
else if(getButtonState(&btnUp))
{
speed = speed - 30;
if(speed<40) speed = 600;
StepMotorSpeed(speed);
}
else if(getButtonState(&btnDown))
{
speed = speed + 30;
if((speed < 1) || (speed > 570)) speed = 40;
StepMotorSpeed(speed);
}
break;
case S_STEP_MOTOR_CCW:
stepMotorDirection = STEP_MOTOR_DIR_CCW;
HAL_TIM_Base_Start_IT(&htim3);
if(getButtonState(&btnStart)) setstepMotorState(S_STEP_MOTOR_IDLE);
else if(getButtonState(&btnDir)) setstepMotorState(S_STEP_MOTOR_CW);
else if(getButtonState(&btnUp))
{
speed = speed - 30;
if(speed<40) speed = 600;
StepMotorSpeed(speed);
}
else if(getButtonState(&btnDown))
{
speed = speed + 30;
if((speed < 1) || (speed > 570)) speed = 40;
StepMotorSpeed(speed);
}
break;
}
// stepMotorRun(STEP_MOTOR_DIR_CW);
//HAL_Delay(7);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
'전기전자 > ARM' 카테고리의 다른 글
Queue 자료구조 구현 (0) | 2021.05.06 |
---|---|
[ARM] I2C 통신을 이용한 DS3231 RTC(Real Time Clock) 구현 (2) | 2021.03.26 |
[ARM] 엘레베이터 프로젝트 - SPI 통신을 이용한 OLED 구현 (0) | 2021.03.18 |
[ARM] 엘레베이터 프로젝트 - EXTI 외부인터럽터 / 포토 인터럽터 센서 이용 (0) | 2021.03.18 |