久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3295|回復: 1
收起左側

STM32定時器2的CNT值異常,只為兩個定值

[復制鏈接]
ID:644357 發表于 2021-3-9 19:26 | 顯示全部樓層 |閱讀模式
150黑幣
定時器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功能時鐘使能
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

  8.         GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);

  9.         //配置IO口為復用功能-定時器通道
  10.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3;
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //復用功能
  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時鐘使能
  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.   * @簡  述  編碼器AB獲取計數器數值
  36.   * @參  數  無
  37.   * @返回值  計數器當前值
  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.   * @簡  述  編碼器AB設置計數器數值
  48.   * @參  數  count  計數器數值
  49.   * @返回值  無
  50.   */
  51. void AX_ENCODER_AB_SetCounter(uint16_t count)
  52. {
  53.         TIM2->CNT = count;
  54. }
復制代碼

PID讀取部分,使用了操作系統的高優先級任務
  1. void PID_task(void*pvParameters)
  2. {
  3.         printf("進行PID計算\r\n");
  4.         while(1)
  5.         {
  6.                  printf("開始進行PID計算\r\n");
  7.                 //計算編碼器變化值,即獲取小車實際速度
  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.                 //設置編碼器初始中間值
  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.                 //運動解析,獲取目標轉速
  18.                 printf("A電機轉速 %d \r\n",ax_encoder_delta[0]);
  19.                 printf("B電機轉速 %d \r\n",ax_encoder_delta[1]);
  20.                 printf("C電機轉速 %d \r\n",ax_encoder_delta[2]);
  21.                 printf("D電機轉速 %d \r\n",ax_encoder_delta[3]);
  22.                  AX_MOVE_Kinematics(ax_vx,ax_vy,ax_vz);
  23.                 printf("A目標轉速 %d \r\n",ax_encoder_delta_target[0]);
  24.                 printf("B目標轉速 %d \r\n",ax_encoder_delta_target[1]);
  25.                 printf("C目標轉速 %d \r\n",ax_encoder_delta_target[2]);
  26.                 printf("D目標轉速 %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電機輸出 %d \r\n",ax_motor_pwm[0]);
  33.                 printf("B電機輸出 %d \r\n",ax_motor_pwm[1]);
  34.                 printf("C電機輸出 %d \r\n",ax_motor_pwm[2]);
  35.                 printf("D電機輸出 %d \r\n",ax_motor_pwm[3]);
  36.                 printf("PID計算完畢\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. }
復制代碼
51hei截圖20210309191938.jpg
A電機得到的速度反饋只能是1,0,-1,然后又去看TIM2,CNT的值,發現是30000,30000是賦的初值。
BC電機被我屏蔽了

通過示波器,觀察D,和A,的編碼器AB相,轉動輪子,波形一致。也換過電機編碼器測試,

綜上,問題直指TIM2CNT 的讀取部分,
附上全部代碼,只求解決問題。

handling trolley FreeRTOS (2).7z

372.44 KB, 下載次數: 4

邏輯部分代碼可能亂一點,看main下面的PID計算任務就行

回復

使用道具 舉報

ID:644357 發表于 2021-3-14 17:39 | 顯示全部樓層
沒人回答我來答,因為TIM2的部分重映射映射到了PB3,而且下載口的JTAG占用了PB3
應在初始化函數中添加
  1.   GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);        // 關閉JTAG功能          GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);            // 重映射TIM2的CH1、CH2到PA15和PB3
復制代碼

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美亚洲 | 成人在线视频网站 | 国产一级特黄视频 | 欧美日韩亚洲国产 | 一区二区三区四区电影视频在线观看 | 国产精品美女久久久久久免费 | 亚洲网站在线播放 | 粉嫩一区二区三区四区公司1 | 91精品一区二区三区久久久久 | 欧美黄页| 美女日皮网站 | 国产精品成人久久久久 | 亚洲国产高清高潮精品美女 | 91在线一区 | 拍拍无遮挡人做人爱视频免费观看 | 91精品综合久久久久久五月天 | 99视频在线免费观看 | 久久久久久久久国产精品 | 一级黄色片网址 | 精品日韩一区二区 | 性一交一乱一透一a级 | 日韩精品一区二区三区中文在线 | 亚洲国产成人av好男人在线观看 | 成人av观看 | 九九九国产 | 亚洲一区二区三区免费视频 | 日本不卡免费新一二三区 | 日韩欧美在线不卡 | 国产精品无码永久免费888 | 国产精品视频一区二区三区 | 欧美1—12sexvideos | 国产免费福利小视频 | 国产一级免费在线观看 | 国产精久久久久久久 | 国际精品久久 | www.日本国产 | 久久毛片 | 91视频在线观看免费 | 国产一区二区精品在线 | 免费观看日韩精品 | 青青草视频网站 |