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

关于官方编码器库函数问题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

查看全部评分

七哥 回答时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版