|
150黑幣
定時(shí)器2初始化,做編碼器讀速度用
- void AX_ENCODER_AB_Init(uint16_t cycle)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_ICInitTypeDef TIM_ICInitStructure;
- //GPIO功能時(shí)鐘使能
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
- GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);
- //配置IO口為復(fù)用功能-定時(shí)器通道
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //復(fù)用功能
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度100MHz
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- //TIM時(shí)鐘使能
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
- //Timer configuration in Encoder mode
- TIM_DeInit(TIM2);
- TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
- TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescaling
- TIM_TimeBaseStructure.TIM_Period = cycle;
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
- TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
- TIM_ICStructInit(&TIM_ICInitStructure);
- TIM_ICInitStructure.TIM_ICFilter = 0;
- TIM_ICInit(TIM2, &TIM_ICInitStructure);
- //Reset counter
- TIM2->CNT = 0;
- TIM_Cmd(TIM2, ENABLE);
- }
- /**
- * @簡(jiǎn) 述 編碼器AB獲取計(jì)數(shù)器數(shù)值
- * @參 數(shù) 無(wú)
- * @返回值 計(jì)數(shù)器當(dāng)前值
- */
- uint16_t AX_ENCODER_AB_GetCounter(void)
- {
- int16_t temp;
- temp=TIM_GetCounter(TIM2);
- printf("CNT的值為%d\r\n",temp);
- <font color="#00ffff" style="background-color: red;"> return (TIM_GetCounter(TIM2)); </font>
- }
- /**
- * @簡(jiǎn) 述 編碼器AB設(shè)置計(jì)數(shù)器數(shù)值
- * @參 數(shù) count 計(jì)數(shù)器數(shù)值
- * @返回值 無(wú)
- */
- void AX_ENCODER_AB_SetCounter(uint16_t count)
- {
- TIM2->CNT = count;
- }
復(fù)制代碼
PID讀取部分,使用了操作系統(tǒng)的高優(yōu)先級(jí)任務(wù)
- void PID_task(void*pvParameters)
- {
- printf("進(jìn)行PID計(jì)算\r\n");
- while(1)
- {
- printf("開(kāi)始進(jìn)行PID計(jì)算\r\n");
- //計(jì)算編碼器變化值,即獲取小車(chē)實(shí)際速度
- ax_encoder_delta[0] = <font color="#00ffff">(<span style="background-color: red;">AX_ENCODER_AB_GetCounter()</span>-</font>ENCODER_MID_VALUE);
- ax_encoder_delta[1] = (AX_ENCODER_CD_GetCounter()-ENCODER_MID_VALUE);
- ax_encoder_delta[2] = (AX_ENCODER_EF_GetCounter()-ENCODER_MID_VALUE);
- ax_encoder_delta[3] = -(AX_ENCODER_GH_GetCounter()-ENCODER_MID_VALUE);
- //設(shè)置編碼器初始中間值
- AX_ENCODER_AB_SetCounter(ENCODER_MID_VALUE);
- AX_ENCODER_CD_SetCounter(ENCODER_MID_VALUE);
- AX_ENCODER_EF_SetCounter(ENCODER_MID_VALUE);
- AX_ENCODER_GH_SetCounter(ENCODER_MID_VALUE);
- //運(yùn)動(dòng)解析,獲取目標(biāo)轉(zhuǎn)速
- printf("A電機(jī)轉(zhuǎn)速 %d \r\n",ax_encoder_delta[0]);
- printf("B電機(jī)轉(zhuǎn)速 %d \r\n",ax_encoder_delta[1]);
- printf("C電機(jī)轉(zhuǎn)速 %d \r\n",ax_encoder_delta[2]);
- printf("D電機(jī)轉(zhuǎn)速 %d \r\n",ax_encoder_delta[3]);
- AX_MOVE_Kinematics(ax_vx,ax_vy,ax_vz);
- printf("A目標(biāo)轉(zhuǎn)速 %d \r\n",ax_encoder_delta_target[0]);
- printf("B目標(biāo)轉(zhuǎn)速 %d \r\n",ax_encoder_delta_target[1]);
- printf("C目標(biāo)轉(zhuǎn)速 %d \r\n",ax_encoder_delta_target[2]);
- printf("D目標(biāo)轉(zhuǎn)速 %d \r\n",ax_encoder_delta_target[3]);
- //PID控制
- ax_motor_pwm[0] = AX_MID_MotorVelocityPidCtl_A(ax_encoder_delta_target[0], ax_encoder_delta[0]);
- ax_motor_pwm[1] = AX_MID_MotorVelocityPidCtl_B(ax_encoder_delta_target[1], ax_encoder_delta[1]);
- ax_motor_pwm[2] = AX_MID_MotorVelocityPidCtl_C(ax_encoder_delta_target[2], ax_encoder_delta[2]);
- ax_motor_pwm[3] = AX_MID_MotorVelocityPidCtl_D(ax_encoder_delta_target[3], ax_encoder_delta[3]);
- printf("A電機(jī)輸出 %d \r\n",ax_motor_pwm[0]);
- printf("B電機(jī)輸出 %d \r\n",ax_motor_pwm[1]);
- printf("C電機(jī)輸出 %d \r\n",ax_motor_pwm[2]);
- printf("D電機(jī)輸出 %d \r\n",ax_motor_pwm[3]);
- printf("PID計(jì)算完畢\r\n");
- AX_MOTOR_A_SetSpeed(ax_motor_pwm[0]);
- AX_MOTOR_B_SetSpeed(ax_motor_pwm[1]);
- AX_MOTOR_C_SetSpeed(ax_motor_pwm[2]);
- AX_MOTOR_D_SetSpeed(ax_motor_pwm[3]);
- vTaskDelay(300);
-
- }
- }
復(fù)制代碼
51hei截圖20210309191938.jpg (9.26 KB, 下載次數(shù): 63)
下載附件
2021-3-9 19:19 上傳
A電機(jī)得到的速度反饋只能是1,0,-1,然后又去看TIM2,CNT的值,發(fā)現(xiàn)是30000,30000是賦的初值。
BC電機(jī)被我屏蔽了
通過(guò)示波器,觀察D,和A,的編碼器AB相,轉(zhuǎn)動(dòng)輪子,波形一致。也換過(guò)電機(jī)編碼器測(cè)試,
綜上,問(wèn)題直指TIM2CNT 的讀取部分,
附上全部代碼,只求解決問(wèn)題。
|
|