BASIC4MCU | 질문게시판 | 답변 : stm32f767 스텝모터 속도 질문있습니다
페이지 정보
작성자 master 작성일2023-05-28 13:34 조회365회 댓글0건본문
#include "stm32f767xx.h"
#include "OK-STM767.h"
//
unsigned char stepForward(void); // 시계방향 회전
unsigned char stepBackward(void); // 반시계방향 회전
// 1상 여자 방식의 구동 데이터
unsigned char step_data[4] = {0x00000001, 0x00000002, 0x00000004, 0x00000008};
// 구동 데이터를 위한 인덱스
int step_index = -1;
//
void Initialize_TIM(void){
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // 타이머 2 클럭 활성화
TIM2->CR1 &= ~TIM_CR1_CEN; // 타이머 2 비활성화
TIM2->PSC = 7999; // 프리스케일러 설정 (타이머 주파수 = APB1 타이머 클럭 / (PSC + 1))
TIM2->ARR = 999; // 자동 재로딩 레지스터 값 설정 (타이머 주기 = (ARR + 1) / 타이머 주파수)
TIM2->CR1 |= TIM_CR1_ARPE; // 자동 재로딩 설정
TIM2->CR1 |= TIM_CR1_CEN; // 타이머 2 활성화
}
//
void Initialize_GPIO(void){
RCC->AHB1ENR|=RCC_AHB1ENR_GPIODEN; // Port D 클럭 활성화
GPIOD->MODER|=GPIO_MODER_MODER0_0|GPIO_MODER_MODER1_0|GPIO_MODER_MODER2_0|GPIO_MODER_MODER3_0; // PD0~PD3 출력
}
//
void Delay_TIM2(uint32_t milliseconds){ TIM2->CNT=0; while(TIM2->CNT<milliseconds); }
//
unsigned char stepForward(void){ if(++step_index>=4)step_index=0; return step_data[step_index]; } // 시계방향 회전
unsigned char stepBackward(void){ if(--step_index<0)step_index=3; return step_data[step_index]; } // 반시계방향 회전
//
int main(void){
Initialize_MCU(); // MCU 및 키트 초기화
Delay_ms(50); // 시스템 안정화를 위해 대기
Initialize_TIM(); // 타이머 초기화
Initialize_GPIO(); // GPIO 초기화
while (1){
for(int i=0;i<2000;i++){ GPIOD->ODR&=~(0x0000000F); GPIOD->ODR|=stepForward(); Delay_TIM2(20); } // 시계
Delay_ms(100);
for(int i=0;i<2000;i++){ GPIOD->ODR&=~(0x0000000F); GPIOD->ODR|=stepBackward(); Delay_TIM2(20); } // 반시계
Delay_ms(100);
}
}
가속율을 낮춰주면서 가속시켜보세요
예를들어서 20ms 딜레이 후에 19ms를 준다면 20ms 후에 1ms가 줄어든 것이고
20ms를 10번 반복후에 19ms를 준다면 200ms 후에 1ms가 줄어든 것입니다.또, 20ms를 10번 반복후에 19ms를 주지 않고20000us -> 19900us -> 19800us -> 19700us -> 19600us -> 19500us -> 19400us -> 19300us -> 19200us -> 19100us -> 19000us 이렇게 준다면 200ms후에 1ms가 줄어드는 가속율은 같지만 훨씬 매끄럽게 가속시키는 것입니다.미리 가감속 테이블을 만들어서 제어하는 것이 좋을 것입니다.mcu달라도 참고해서 만들어보세요
댓글 0
조회수 365등록된 댓글이 없습니다.