找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3333|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STM32定時(shí)器2的CNT值異常,只為兩個(gè)定值

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
150黑幣
定時(shí)器2初始化,做編碼器讀速度用
  1. void AX_ENCODER_AB_Init(uint16_t cycle)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  5.         TIM_ICInitTypeDef TIM_ICInitStructure;   

  6.         //GPIO功能時(shí)鐘使能
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

  8.         GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);

  9.         //配置IO口為復(fù)用功能-定時(shí)器通道
  10.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3;
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //復(fù)用功能
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //速度100MHz
  13.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  14.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_15;
  15.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  16.         //TIM時(shí)鐘使能
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  18.         //Timer configuration in Encoder mode
  19.         TIM_DeInit(TIM2);
  20.         TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

  21.         TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling
  22.         TIM_TimeBaseStructure.TIM_Period = cycle;  
  23.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  24.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
  25.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  26.         TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
  27.         TIM_ICStructInit(&TIM_ICInitStructure);
  28.         TIM_ICInitStructure.TIM_ICFilter = 0;
  29.         TIM_ICInit(TIM2, &TIM_ICInitStructure);
  30.         //Reset counter
  31.         TIM2->CNT = 0;
  32.         TIM_Cmd(TIM2, ENABLE);   
  33. }

  34. /**
  35.   * @簡(jiǎn)  述  編碼器AB獲取計(jì)數(shù)器數(shù)值
  36.   * @參  數(shù)  無(wú)
  37.   * @返回值  計(jì)數(shù)器當(dāng)前值
  38.   */
  39. uint16_t AX_ENCODER_AB_GetCounter(void)
  40. {
  41.         int16_t temp;
  42.         temp=TIM_GetCounter(TIM2);
  43.         printf("CNT的值為%d\r\n",temp);
  44. <font color="#00ffff" style="background-color: red;">        return (TIM_GetCounter(TIM2)); </font>
  45. }

  46. /**
  47.   * @簡(jiǎn)  述  編碼器AB設(shè)置計(jì)數(shù)器數(shù)值
  48.   * @參  數(shù)  count  計(jì)數(shù)器數(shù)值
  49.   * @返回值  無(wú)
  50.   */
  51. void AX_ENCODER_AB_SetCounter(uint16_t count)
  52. {
  53.         TIM2->CNT = count;
  54. }
復(fù)制代碼

PID讀取部分,使用了操作系統(tǒng)的高優(yōu)先級(jí)任務(wù)
  1. void PID_task(void*pvParameters)
  2. {
  3.         printf("進(jìn)行PID計(jì)算\r\n");
  4.         while(1)
  5.         {
  6.                  printf("開(kāi)始進(jìn)行PID計(jì)算\r\n");
  7.                 //計(jì)算編碼器變化值,即獲取小車(chē)實(shí)際速度
  8.                         ax_encoder_delta[0] =  <font color="#00ffff">(<span style="background-color: red;">AX_ENCODER_AB_GetCounter()</span>-</font>ENCODER_MID_VALUE);
  9.                         ax_encoder_delta[1] =  (AX_ENCODER_CD_GetCounter()-ENCODER_MID_VALUE);
  10.                         ax_encoder_delta[2] =  (AX_ENCODER_EF_GetCounter()-ENCODER_MID_VALUE);
  11.                         ax_encoder_delta[3] = -(AX_ENCODER_GH_GetCounter()-ENCODER_MID_VALUE);
  12.                 //設(shè)置編碼器初始中間值
  13.                         AX_ENCODER_AB_SetCounter(ENCODER_MID_VALUE);
  14.                         AX_ENCODER_CD_SetCounter(ENCODER_MID_VALUE);
  15.                         AX_ENCODER_EF_SetCounter(ENCODER_MID_VALUE);
  16.                         AX_ENCODER_GH_SetCounter(ENCODER_MID_VALUE);                        
  17.                 //運(yùn)動(dòng)解析,獲取目標(biāo)轉(zhuǎn)速
  18.                 printf("A電機(jī)轉(zhuǎn)速 %d \r\n",ax_encoder_delta[0]);
  19.                 printf("B電機(jī)轉(zhuǎn)速 %d \r\n",ax_encoder_delta[1]);
  20.                 printf("C電機(jī)轉(zhuǎn)速 %d \r\n",ax_encoder_delta[2]);
  21.                 printf("D電機(jī)轉(zhuǎn)速 %d \r\n",ax_encoder_delta[3]);
  22.                  AX_MOVE_Kinematics(ax_vx,ax_vy,ax_vz);
  23.                 printf("A目標(biāo)轉(zhuǎn)速 %d \r\n",ax_encoder_delta_target[0]);
  24.                 printf("B目標(biāo)轉(zhuǎn)速 %d \r\n",ax_encoder_delta_target[1]);
  25.                 printf("C目標(biāo)轉(zhuǎn)速 %d \r\n",ax_encoder_delta_target[2]);
  26.                 printf("D目標(biāo)轉(zhuǎn)速 %d \r\n",ax_encoder_delta_target[3]);
  27.                 //PID控制
  28.                         ax_motor_pwm[0] = AX_MID_MotorVelocityPidCtl_A(ax_encoder_delta_target[0], ax_encoder_delta[0]);   
  29.                         ax_motor_pwm[1] = AX_MID_MotorVelocityPidCtl_B(ax_encoder_delta_target[1], ax_encoder_delta[1]);   
  30.                         ax_motor_pwm[2] = AX_MID_MotorVelocityPidCtl_C(ax_encoder_delta_target[2], ax_encoder_delta[2]);   
  31.                         ax_motor_pwm[3] = AX_MID_MotorVelocityPidCtl_D(ax_encoder_delta_target[3], ax_encoder_delta[3]);
  32.                 printf("A電機(jī)輸出 %d \r\n",ax_motor_pwm[0]);
  33.                 printf("B電機(jī)輸出 %d \r\n",ax_motor_pwm[1]);
  34.                 printf("C電機(jī)輸出 %d \r\n",ax_motor_pwm[2]);
  35.                 printf("D電機(jī)輸出 %d \r\n",ax_motor_pwm[3]);
  36.                 printf("PID計(jì)算完畢\r\n");
  37.                 AX_MOTOR_A_SetSpeed(ax_motor_pwm[0]);
  38.                 AX_MOTOR_B_SetSpeed(ax_motor_pwm[1]);
  39.                 AX_MOTOR_C_SetSpeed(ax_motor_pwm[2]);
  40.                 AX_MOTOR_D_SetSpeed(ax_motor_pwm[3]);
  41.                 vTaskDelay(300);
  42.                
  43.          }
  44. }
復(fù)制代碼

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)題。

handling trolley FreeRTOS (2).7z

372.44 KB, 下載次數(shù): 4

邏輯部分代碼可能亂一點(diǎn),看main下面的PID計(jì)算任務(wù)就行

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:644357 發(fā)表于 2021-3-14 17:39 | 只看該作者
沒(méi)人回答我來(lái)答,因?yàn)門(mén)IM2的部分重映射映射到了PB3,而且下載口的JTAG占用了PB3
應(yīng)在初始化函數(shù)中添加
  1.   GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);        // 關(guān)閉JTAG功能          GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);            // 重映射TIM2的CH1、CH2到PA15和PB3
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表