⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stm32f10x_encoder.lst

📁 STM32利用正交编码器实现电机的控制
💻 LST
📖 第 1 页 / 共 2 页
字号:
##############################################################################
#                                                                            #
# IAR ARM ANSI C/C++ Compiler V4.42A/W32               15/May/2008  12:06:30 #
# Copyright 1999-2005 IAR Systems. All rights reserved.                      #
#                                                                            #
#    Cpu mode        =  thumb                                                #
#    Endian          =  little                                               #
#    Stack alignment =  4                                                    #
#    Source file     =  C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM        #
#                       Encoder\example\project\source\stm32f10x_encoder.c   #
#    Command line    =  "C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM       #
#                       Encoder\example\project\source\stm32f10x_encoder.c"  #
#                       -D VECT_TAB_FLASH -lcN "C:\David JIANG\ST            #
#                       MCU\Docs\STM32\AN_JIANG\TIM                          #
#                       Encoder\example\project\EWARM\BOOT_FLASH\List\" -lb  #
#                       "C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM       #
#                       Encoder\example\project\EWARM\BOOT_FLASH\List\" -o   #
#                       "C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM       #
#                       Encoder\example\project\EWARM\BOOT_FLASH\Obj\" -z3   #
#                       --no_cse --no_unroll --no_inline --no_code_motion    #
#                       --no_tbaa --no_clustering --no_scheduling --debug    #
#                       --cpu_mode thumb --endian little --cpu cortex-M3     #
#                       --stack_align 4 --require_prototypes --fpu None      #
#                       --dlib_config "C:\Program Files\IAR                  #
#                       Systems\Embedded Workbench                           #
#                       4.0\arm\LIB\dl7mptnnl8f.h" -I "C:\David JIANG\ST     #
#                       MCU\Docs\STM32\AN_JIANG\TIM                          #
#                       Encoder\example\project\EWARM\" -I "C:\David         #
#                       JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM                 #
#                       Encoder\example\project\EWARM\..\include\" -I        #
#                       "C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM       #
#                       Encoder\example\project\EWARM\..\..\FWLib\inc\" -I   #
#                       "C:\Program Files\IAR Systems\Embedded Workbench     #
#                       4.0\arm\INC\"                                        #
#    List file       =  C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM        #
#                       Encoder\example\project\EWARM\BOOT_FLASH\List\stm32f #
#                       10x_encoder.lst                                      #
#    Object file     =  C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM        #
#                       Encoder\example\project\EWARM\BOOT_FLASH\Obj\stm32f1 #
#                       0x_encoder.r79                                       #
#                                                                            #
#                                                                            #
##############################################################################

C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM Encoder\example\project\source\stm32f10x_encoder.c
      1          /******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
      2          * File Name          : stm32f10x_encoder.c 
      3          * Author             : IMS Systems Lab  
      4          * Date First Issued  : 21/11/07
      5          * Description        : This file contains the software implementation for the
      6          *                      encoder unit
      7          ********************************************************************************
      8          * History:
      9          * 21/11/07 v1.0
     10          ********************************************************************************
     11          * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
     12          * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
     13          * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
     14          * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
     15          * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
     16          * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
     17          *******************************************************************************/
     18          /* Includes ------------------------------------------------------------------*/
     19          #include "stm32f10x_lib.h"
     20          #include "stm32f10x_encoder.h"
     21          #include "lcd.h"
     22          
     23          /* Private typedef -----------------------------------------------------------*/
     24          /* Private define ------------------------------------------------------------*/
     25          #define ENCODER_TIMER   TIM3  // Encoder unit connected to TIM3
     26          #define ENCODER_PPR           (u16)(400)   // number of pulses per revolution
     27          #define SPEED_BUFFER_SIZE 8
     28          
     29          #define COUNTER_RESET   (u16)0
     30          #define ICx_FILTER      (u8) 6 // 6<-> 670nsec
     31          
     32          #define TIMx_PRE_EMPTION_PRIORITY 1
     33          #define TIMx_SUB_PRIORITY 0
     34          
     35          #define SPEED_SAMPLING_FREQ (u16)(2000/(SPEED_SAMPLING_TIME+1))
     36          
     37          /* Private functions ---------------------------------------------------------*/
     38          s16 ENC_Calc_Rot_Speed(void);
     39          
     40          /* Private variables ---------------------------------------------------------*/
     41          static s16 hPrevious_angle, hSpeed_Buffer[SPEED_BUFFER_SIZE], hRot_Speed;
     42          static u8 bSpeed_Buffer_Index = 0;
     43          static volatile u16 hEncoder_Timer_Overflow; 
     44          static bool bIs_First_Measurement = TRUE;
     45          
     46          /*******************************************************************************
     47          * Function Name  : ENC_Init
     48          * Description    : General Purpose Timer x set-up for encoder speed/position 
     49          *                  sensors
     50          * Input          : None
     51          * Output         : None
     52          * Return         : None
     53          *******************************************************************************/
     54          void ENC_Init(void)
     55          {
     56            TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
     57            TIM_ICInitTypeDef TIM_ICInitStructure;
     58            
     59          /* Encoder unit connected to TIM3, 4X mode */    
     60            GPIO_InitTypeDef GPIO_InitStructure;
     61            NVIC_InitTypeDef NVIC_InitStructure;
     62            
     63            /* TIM3 clock source enable */
     64            RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
     65            /* Enable GPIOA, clock */
     66            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
     67            
     68            GPIO_StructInit(&GPIO_InitStructure);
     69            /* Configure PA.06,07 as encoder input */
     70            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
     71            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
     72            GPIO_Init(GPIOA, &GPIO_InitStructure);
     73            
     74            /* Enable the TIM3 Update Interrupt */
     75            NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;
     76            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;
     77            NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;
     78            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     79            NVIC_Init(&NVIC_InitStructure);
     80          
     81            /* Timer configuration in Encoder mode */
     82            TIM_DeInit(ENCODER_TIMER);
     83            TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
     84            
     85            TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling 
     86            TIM_TimeBaseStructure.TIM_Period = (4*ENCODER_PPR)-1;  
     87            TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
     88            TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
     89            TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);
     90           
     91            TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI12, 
     92                                       TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
     93            TIM_ICStructInit(&TIM_ICInitStructure);
     94            TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;
     95            TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);
     96            
     97           // Clear all pending interrupts
     98            TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
     99            TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);
    100            //Reset counter
    101            TIM2->CNT = COUNTER_RESET;
    102            
    103            ENC_Clear_Speed_Buffer();
    104            
    105            TIM_Cmd(ENCODER_TIMER, ENABLE);  
    106          }
    107          
    108          /*******************************************************************************
    109          * Function Name  : ENC_Get_Electrical_Angle
    110          * Description    : Returns the absolute electrical Rotor angle 
    111          * Input          : None
    112          * Output         : None
    113          * Return         : Rotor electrical angle: 0 -> 0 degrees, 
    114          *                                          S16_MAX-> 180 degrees, 
    115          *                                          S16_MIN-> -180 degrees                  
    116          *******************************************************************************/
    117          s16 ENC_Get_Electrical_Angle(void)
    118          {
    119            s32 temp;
    120            
    121            temp = (s32)(TIM_GetCounter(ENCODER_TIMER)) * (s32)(U32_MAX / (4*ENCODER_PPR)); 
    122            return((s16)(temp/65536)); // s16 result
    123          }
    124          
    125          /*******************************************************************************
    126          * Function Name  : ENC_Clear_Speed_Buffer
    127          * Description    : Clear speed buffer used for average speed calculation  
    128          * Input          : None
    129          * Output         : None
    130          * Return         : None
    131          *******************************************************************************/
    132          void ENC_Clear_Speed_Buffer(void)
    133          {   
    134            u32 i;
    135          
    136            for (i=0;i<SPEED_BUFFER_SIZE;i++)
    137            {
    138              hSpeed_Buffer[i] = 0;
    139            }
    140            bIs_First_Measurement = TRUE;
    141          }
    142          
    143          /*******************************************************************************
    144          * Function Name  : ENC_Calc_Rot_Speed
    145          * Description    : Compute return latest speed measurement 
    146          * Input          : None
    147          * Output         : s16
    148          * Return         : Return the speed in 0.1 Hz resolution.                    
    149          *******************************************************************************/
    150          s16 ENC_Calc_Rot_Speed(void)
    151          {   
    152            s32 wDelta_angle;
    153            u16 hEnc_Timer_Overflow_sample_one, hEnc_Timer_Overflow_sample_two;
    154            u16 hCurrent_angle_sample_one, hCurrent_angle_sample_two;
    155            signed long long temp;
    156            s16 haux;
    157            
    158            if (!bIs_First_Measurement)
    159            {
    160              // 1st reading of overflow counter    
    161              hEnc_Timer_Overflow_sample_one = hEncoder_Timer_Overflow; 
    162              // 1st reading of encoder timer counter
    163              hCurrent_angle_sample_one = ENCODER_TIMER->CNT;
    164              // 2nd reading of overflow counter
    165              hEnc_Timer_Overflow_sample_two = hEncoder_Timer_Overflow;  
    166              // 2nd reading of encoder timer counter
    167              hCurrent_angle_sample_two = ENCODER_TIMER->CNT;      
    168          
    169              // Reset hEncoder_Timer_Overflow and read the counter value for the next
    170              // measurement
    171              hEncoder_Timer_Overflow = 0;
    172              haux = ENCODER_TIMER->CNT;   
    173              
    174              if (hEncoder_Timer_Overflow != 0) 
    175              {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -