Witam, mam 2 silniczki pololu z enkoderami magnetycznymi link poniżej i potrzebuję do mojego projektu aby uzyskać stałą prędkość niezależnie od obciążenia czy naładowania akumulatora. Silniki sterowane PWM. Mam taki program odczytuję tylko sygnał z enkodera jako PWM, ale wyniki trochę od siebie odbiegają niby przy tej samej prędkości nawet po przepuszczeniu przez inverter. Wiem ze stm posiada Encoder Interface Mode czy on lepiej naddaje się do odczytu sygnału z enkodera? Jak napisać stabilizator prędkości?
Silnik DC z enkoderem
void TIM1_CC_IRQHandler(void){
TIM_ClearITPendingBit(TIM1,TIM_IT_CC1);
IC1 = TIM_GetCapture1(TIM1);
if(IC1 != 0)
{
wsp_wyp = (TIM_GetCapture2(TIM1)*100) / IC1;
czestotliwosc = 72000000 / IC1;
// xxx = (wsp_wyp / 100) * czestotliwosc;
if (IC1 == 958){
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
TIM_Cmd(TIM3, DISABLE);
}
}
else
{
wsp_wyp = 0;
czestotliwosc = 0;
}
}
int main (void){
RCC_conf();
NVIC_conf();
UART_conf();
TIME_conf();
GPIO_conf();
while (1)
{
printf("f = %.3f\n", czestotliwosc);
printf("wspolczynnik = %.3f\n", wsp_wyp);
delay(400);
}
}
void TIME_conf (void){
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
//conf TIM3 do generowania PWM
TIM_TimeBaseStructure.TIM_Period = 3200;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1400;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure); // PA6 PWM out
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_Cmd(TIM3, ENABLE);
//conf TIM1 do pomiaru PWM
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; // PA8 PWM read
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_PWMIConfig(TIM1, &TIM_ICInitStructure);
TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);
TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);
TIM_Cmd(TIM1, ENABLE);
TIM_ITConfig(TIM1, TIM_IT_CC2, ENABLE);
}
void NVIC_conf (void){
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}