你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于官方编码器库函数问题U16_MAX,U32_MAX,s16

[复制链接]
a1807332965 提问时间:2018-2-23 11:05 /
本人小萌新一枚,借鉴贴吧大神魔改出一套stm32f10x程序,遇到了许多问题:
1.如图一图二,U16_MAX,U32_MAX这样定义对不对。
2.如图三,s16 一直说没有定义。
.
.
.
跪求解答!!

图一

图一

图二

图二

图三

图三
收藏 评论8 发布时间:2018-2-23 11:05

举报

8个回答
a1807332965 回答时间:2018-2-23 11:09:03
修改的程序....
/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
* File Name          : stm32f10x_encoder.c
* Author             : IMS Systems Lab  
* Date First Issued  : 21/11/07
* Description        : This file contains the software implementation for the
*                      encoder unit
********************************************************************************
* History:
* 21/11/07 v1.0
********************************************************************************
* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_encoder.h"
#include "stm32f10x.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define ENCODER_TIMER   TIM3  // Encoder unit connected to TIM3
#define ENCODER_PPR           (u16)(400)   // number of pulses per revolution
#define SPEED_BUFFER_SIZE 8

#define COUNTER_RESET   (u16)0
#define ICx_FILTER      (u8) 6 // 6<-> 670nsec

#define TIMx_PRE_EMPTION_PRIORITY 1
#define TIMx_SUB_PRIORITY 0

#define SPEED_SAMPLING_FREQ (u16)(2000/(SPEED_SAMPLING_TIME+1))

#define U16_MAX ((u16)65535u)
#define U32_MAX ((u32)4294967295uL)
/* Private functions ---------------------------------------------------------*/
s16 ENC_Calc_Rot_Speed(void);

/* Private variables ---------------------------------------------------------*/
//static s16 hPrevious_angle/*, hSpeed_Buffer[SPEED_BUFFER_SIZE],hRot_Speed*/;
//static u8 bSpeed_Buffer_Index = 0;
//static bool bIs_First_Measurement = TRUE;
static volatile u16 hEncoder_Timer_Overflow;
/*******************************************************************************
* Function Name  : ENC_Init
* Description    : General Purpose Timer x set-up for encoder speed/position
*                  sensors
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void ENC_Init(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_ICInitTypeDef TIM_ICInitStructure;
  
/* Encoder unit connected to TIM3, 4X mode */   
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* TIM3 clock source enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  /* Enable GPIOA, clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  
  GPIO_StructInit(&GPIO_InitStructure);
  /* Configure PA.06,07 as encoder input */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* Enable the TIM3 Update Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* Timer configuration in Encoder mode */
  TIM_DeInit(ENCODER_TIMER);
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling
  TIM_TimeBaseStructure.TIM_Period = (4*ENCODER_PPR)-1;  
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
  TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);

  TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI12,
                             TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;
  TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);
  
// Clear all pending interrupts
  TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
  TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);
  //Reset counter
  TIM2->CNT = COUNTER_RESET;
  
  ENC_Clear_Speed_Buffer();
  
  TIM_Cmd(ENCODER_TIMER, ENABLE);  
}

/*******************************************************************************
* Function Name  : ENC_Get_Electrical_Angle
* Description    : Returns the absolute electrical Rotor angle
* Input          : None
* Output         : None
* Return         : Rotor electrical angle: 0 -> 0 degrees,
*                                          S16_MAX-> 180 degrees,
*                                          S16_MIN-> -180 degrees                  
*******************************************************************************/
s16 ENC_Get_Electrical_Angle(void)
{
  s32 temp;
  
  temp = (s32)(TIM_GetCounter(ENCODER_TIMER)) * (s32)(U32_MAX / (4*ENCODER_PPR));
  return((s16)(temp/65536)); // s16 result
}

/*******************************************************************************
* Function Name  : ENC_Clear_Speed_Buffer
* Description    : Clear speed buffer used for average speed calculation  
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
//void ENC_Clear_Speed_Buffer(void)
//{   
//  u32 i;

//  for (i=0;i<SPEED_BUFFER_SIZE;i++)
//  {
//    hSpeed_Buffer[i] = 0;
//  }
//  bIs_First_Measurement = TRUE;
//}

/*******************************************************************************
* Function Name  : ENC_Calc_Rot_Speed
* Description    : Compute return latest speed measurement
* Input          : None
* Output         : s16
* Return         : Return the speed in 0.1 Hz resolution.                    
*******************************************************************************/
//s16 ENC_Calc_Rot_Speed(void)
//{   
//  s32 wDelta_angle;
//  u16 hEnc_Timer_Overflow_sample_one, hEnc_Timer_Overflow_sample_two;
//  u16 hCurrent_angle_sample_one, hCurrent_angle_sample_two;
//  signed long long temp;
//  s16 haux;
//  
//  if (!bIs_First_Measurement)
//  {
//    // 1st reading of overflow counter   
//    hEnc_Timer_Overflow_sample_one = hEncoder_Timer_Overflow;
//    // 1st reading of encoder timer counter
//    hCurrent_angle_sample_one = ENCODER_TIMER->CNT;
//    // 2nd reading of overflow counter
//    hEnc_Timer_Overflow_sample_two = hEncoder_Timer_Overflow;  
//    // 2nd reading of encoder timer counter
//    hCurrent_angle_sample_two = ENCODER_TIMER->CNT;      

//    // Reset hEncoder_Timer_Overflow and read the counter value for the next
//    // measurement
//    hEncoder_Timer_Overflow = 0;
//    haux = ENCODER_TIMER->CNT;   
//   
//    if (hEncoder_Timer_Overflow != 0)
//    {
//      haux = ENCODER_TIMER->CNT;
//      hEncoder_Timer_Overflow = 0;            
//    }
//     
//    if (hEnc_Timer_Overflow_sample_one != hEnc_Timer_Overflow_sample_two)
//    { //Compare sample 1 & 2 and check if an overflow has been generated right
//      //after the reading of encoder timer. If yes, copy sample 2 result in
//      //sample 1 for next process
//      hCurrent_angle_sample_one = hCurrent_angle_sample_two;
//      hEnc_Timer_Overflow_sample_one = hEnc_Timer_Overflow_sample_two;
//    }
//   
//    if ( (ENCODER_TIMER->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down)  
//    {// encoder timer down-counting
//      wDelta_angle = (s32)(hCurrent_angle_sample_one - hPrevious_angle -
//                    (hEnc_Timer_Overflow_sample_one) * (4*ENCODER_PPR));
//    }
//    else  
//    {//encoder timer up-counting
//      wDelta_angle = (s32)(hCurrent_angle_sample_one - hPrevious_angle +
//                    (hEnc_Timer_Overflow_sample_one) * (4*ENCODER_PPR));
//    }
//   
//    // speed computation as delta angle * 1/(speed sempling time)
//    temp = (signed long long)(wDelta_angle * SPEED_SAMPLING_FREQ);
//    temp *= 10;  // 0.1 Hz resolution
//    temp /= (4*ENCODER_PPR);
//        
//  } //is first measurement, discard it
//  else
//  {
//    bIs_First_Measurement = FALSE;
//    temp = 0;
//    hEncoder_Timer_Overflow = 0;
//    haux = ENCODER_TIMER->CNT;      
//    // Check if Encoder_Timer_Overflow is still zero. In case an overflow IT
//    // occured it resets overflow counter and wPWM_Counter_Angular_Velocity
//    if (hEncoder_Timer_Overflow != 0)
//    {
//      haux = ENCODER_TIMER->CNT;
//      hEncoder_Timer_Overflow = 0;            
//    }
//  }
//  
//  hPrevious_angle = haux;  
//
//  return((s16) temp);
//}



/*******************************************************************************
* Function Name  : TIM2_IRQHandler
* Description    : This function handles TIMx Update interrupt request.
                   Encoder unit connected to TIM2
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void TIM3_IRQHandler(void)
{  
  /* Clear the interrupt pending flag */
  TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
  
  if (hEncoder_Timer_Overflow != U16_MAX)  
  {
   hEncoder_Timer_Overflow++;
  }
}

/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/
a1807332965 回答时间:2018-2-23 11:09:23

....

本帖最后由 a1807332965 于 2018-2-23 11:11 编辑

自己顶顶
回答时间:2018-2-23 11:32:05
本帖最后由 安 于 2018-2-23 14:20 编辑

stdint.h是否引用。另外,看一下stm32f10x.h中使用定义了s16。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

努力的人 回答时间:2018-2-23 11:33:29
你加上 u16 U16_MAX;
           u32 U32_MAX;
试一下,你应该查找你自定义的数据结构,或者你有头文件没加上,导致你s16没有定义,这个是纯c语言的问题

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wenyangzeng 回答时间:2018-2-23 11:52:15
本帖最后由 wenyangzeng 于 2018-2-23 13:26 编辑
a1807332965 发表于 2018-2-23 11:09
修改的程序....
/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
* Fi ...

在stdint.h中已经定义:
typedef   signed       __int64 intmax_t;
typedef unsigned       __int64 uintmax_t;#define UINT8_MAX                   255
#define UINT16_MAX                65535
#define UINT32_MAX           4294967295u
#define UINT64_MAX __ESCAPE__(18446744073709551615ull)


老老实实使用就是。不知楼主为何还要自定义U16_MAX和U32_MAX?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

Tcreat 回答时间:2018-2-23 14:19:38
你这宏定义的位置是不是放错了 我看你这文件是.c文件中 出现错误的位置是.h文件

评分

参与人数 1蝴蝶豆 +1 收起 理由
zero99 + 1

查看全部评分

wudianjun2001 回答时间:2018-2-23 14:44:32
这个一般都是在头文件中定义的,具体查找一下,看看定义的区别

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

toofree 回答时间:2018-2-26 12:44:02
请参考系统头文件“stdint.h”

s16是个什么类型,如果是有符号16位的话,那参考int16_t定义。
傲游截图20180226123924.png

U16_MAX、U32_MAX没必要自己定义,尽可能用系统编译器中自带的。如果要定义,那就照猫画虎,在自己类型定义中改个名。
傲游截图20180226123956.png



评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版