找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2346|回复: 1
打印 上一主题 下一主题
收起左侧

STM32定时器2的CNT值异常,只为两个定值

[复制链接]
跳转到指定楼层
楼主
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. }
复制代码

A电机得到的速度反馈只能是1,0,-1,然后又去看TIM2,CNT的值,发现是30000,30000是赋的初值。
BC电机被我屏蔽了

通过示波器,观察D,和A,的编码器AB相,转动轮子,波形一致。也换过电机编码器测试,

综上,问题直指TIM2CNT 的读取部分,
附上全部代码,只求解决问题。

handling trolley FreeRTOS (2).7z

372.44 KB, 下载次数: 4

逻辑部分代码可能乱一点,看main下面的PID计算任务就行

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 单片机教程网

快速回复 返回顶部 返回列表