?? stm32f10x_encoder.lst
字號(hào):
##############################################################################
# #
# 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 {
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -