I'v 스테퍼와 유사한 문제의 어떤 종류가 있었다 모터. I'v는 (DRV8825, A4899 칩)을위한 스테퍼 드라이버 코드를 만들었고, 코드는 iRQ를 기반으로하고 모터 가속, 속도 등을 계산하는 수학을 사용했습니다. 그러나 그것이 정확한지 테스트해야했기 때문에 단계를 세워야했습니다. 테스트 케이스의 경우, 콘크리트 핀을 ETR (외부 트리거 입력)으로 설정했습니다. 입력 핀이므로 스테퍼 출력 핀이 해당 입력으로 이동합니다 (모터도 마찬가지 임). 그리고 각 상승 또는 하강 에지 (구성에 따라 다름)는 irq를 생성하므로, irq에서 귀하의 경우 펄스의 단계 카운터를 설정할 수 있습니다.
저는 cubeMX에 익숙하지 않아 대부분의 경우 직접 등록하거나 오래된 SPL (표준 주변 드라이버)을 사용하여 작성합니다. cubeMX 사용자가 읽을 수 있어야하므로 SPL과 어떻게 작동하는지 보여 드리겠습니다. 어쨌든
난 그냥 껄 구체적인 코드는 첫째
입력 핀 (단지 몇 개의 핀이 외부 트리거로 콘크리트 타이머 작업 할 수 있습니다 데이터 시트 읽기)를 구성 STM32f030에서 작동하는 방법의 기본 개념을 보여주기 위해 노력
void digital_input_config (void){
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_2);
}
이제 타이머 설정이 필요합니다. 각 타이머에는 ETR이있는 다른 핀이 있으므로 STM32 MCU에 따라 다릅니다. 데이터 시트를 정확하게 읽어야합니다.
void enable_capture_TIM1(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_ETRClockMode2Config(TIM1,TIM_ExtTRGPSC_DIV_NONE,TIM_ExtTRGPolarity_NonInverted,0x00);
TIM_SelectInputTrigger(TIM1,TIM_TS_ETRF);
TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_Trigger);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = TIM1_BRK_UP_TRG_COM_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
TIM_Cmd(TIM1, ENABLE);
TIM_ITConfig(TIM1, TIM_IT_Trigger, ENABLE);
}
그리고 펄스 카운팅을 할 수 있습니다.
void TIM1_BRK_UP_TRG_COM_IRQHandler(void){
if(TIM_GetITStatus(TIM1, TIM_IT_Trigger) != RESET) {
TIM_ClearITPendingBit(TIM1, TIM_IT_Trigger);
PulseCNT++;
}
}
펄스 발생기로이 코드를 테스트했는데 정말 정확합니다. 펄스 수 또는 주파수 측정에 사용할 수 있습니다.