/******************** (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 "sys.h"
#include "uart.h"
#include "systim3.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define ENCODER_TIMER TIM3 // Encoder unit connected to TIM3
#define ENCODER_PPR (u16)(900) // 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)(1000/(SPEED_SAMPLING_TIME+1))
/* 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 volatile u16 hEncoder_Timer_Overflow;
static bool bIs_First_Measurement = TRUE;
/*******************************************************************************
* 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_IPU;
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_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
ENCODER_TIMER->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 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 +
上一篇:示波器調試RS485通信波形圖
下一篇:stemwin 使用GUI_EndDialog切換頁面死機的解決
推薦閱讀
史海拾趣
為了進一步提升品牌影響力和市場競爭力,Digital View公司開始實施國際化戰略。公司積極參加國際展覽和論壇,與全球同行建立合作關系,引進先進技術和管理經驗。同時,公司還在海外設立研發中心和生產基地,以便更好地服務全球客戶。通過國際化戰略的實施,Digital View的品牌知名度和市場份額均得到了顯著提升。
在半導體測試領域取得成功后,東沅并沒有停止前進的步伐。他們開始關注新興的電子行業趨勢,并決定拓展新的業務領域。例如,他們開始研發和生產與電源管理相關的Power Mosfet產品,這些產品具有高效能、高可靠度和價格優勢等特點,迅速在市場上占據了一席之地。此外,東沅還積極拓展射頻和模擬芯片領域的研發和銷售,為客戶提供更全面的解決方案。
隨著全球市場的不斷變化和競爭的加劇,Curtis不斷加強全球布局和戰略合作。公司與多家國際知名企業建立了長期合作關系,共同開發新產品、拓展新市場。此外,Curtis還積極參與國際展覽和交流活動,展示公司的最新技術和產品成果,提高品牌知名度和影響力。這些全球布局和戰略合作有助于Curtis更好地應對市場挑戰、把握發展機遇。
隨著技術的不斷成熟,Globaltech開始積極拓展國際市場。公司通過與國內外多家系統廠商建立緊密的合作關系,共同開發新產品,進一步提升了其市場競爭力。特別是在亞洲市場,Globaltech憑借其高性價比的產品和快速的響應能力,迅速占據了大量市場份額。同時,公司還積極參與國際展會,與全球客戶面對面交流,進一步提升了品牌知名度和影響力。
Globaltech的創立可以追溯到21世紀初,當時創始人憑借在電源管理IC設計領域的深厚經驗,決定創立一家專注于此領域的公司。公司初期聚焦于線性穩壓器和開關穩壓器等基礎產品的研發,這些產品廣泛應用于PC、通訊和消費類電子產品中。通過持續的技術創新和產品優化,Globaltech迅速在市場上站穩腳跟,贏得了多家知名電子制造商的青睞。
博巨興公司始終秉持開放合作的理念,積極與高校和研究機構展開產學研合作。2008年至2010年間,公司先后與廈門大學、中南大學、湖南大學結成產學研型戰略伙伴關系,共同推動芯片技術的研發與應用。同時,公司還不斷拓展市場,在上海建立了分公司,并在順德、廈門、天津、杭州、西安等地設立了辦事處,為公司的長遠發展奠定了堅實基礎。
這些故事雖然基于虛構,但反映了博巨興公司在電子行業發展中不斷探索、創新、合作與拓展的歷程。通過這些努力,博巨興公司逐漸在芯片代理和研發領域取得了顯著成績,為電子行業的發展做出了積極貢獻。
我設計制作了一控制電路,用4013制作了個單穩態和雙穩態,控制信號觸發單穩態,單穩態觸發雙穩態,雙穩態通過9014控制繼電器。開始調試還可以,后來繼電器就嚴重干擾了雙穩態指使雙穩態電路自動多次轉換狀態。可以判定繼電器的干擾沒有干擾單穩態及 ...… 查看全部問答∨ |
|
急啊,快瘋了.關于vxworks for powerpc的cache問題 使用的是powerpc的mpc860. 操作系統是vxworks. 我想禁止cache功能. 是不是在confih.h里直接undef user_i_cache_enable,undef user_d_cache_enable就可以了? 我的問題就出在這里. 我是這么做的,但是在調試的時候,還能看到對cache的初始化,包括 ...… 查看全部問答∨ |
我用的IP是10.125.131.198。對方廣播時,我用EtherPeek軟件能監視到廣播數據是發送到10.125.131.255的,可我的vxworks軟件就是收不到。但我把IP改到192.168.0.198之后,對方的廣播發送到192.168.0.255我就能收到了;或者對方把廣播IP改為10.255.255 ...… 查看全部問答∨ |
申請試用TI MSP-EXP430G2觸摸式智能家居控制、安防控制和傳感器方面 10.15-10.31 板子開發環境和片上外設熟悉、測試11.1-11.10 產品功能設計、PCB繪制11.11-11.20 程序編寫、調試11.21-11.30 產品測試、發布心得體會和過程分 觸摸式控制居室燈光 ...… 查看全部問答∨ |
|
LM3S9B92只用于USB HOST模式下USB0_VBUS和USB0_ID設置 LM3S9B92用于USB HOST模式下USB0_VBUS和USB0_ID是否必須要連接到VCC和GND嗎? 我看了文檔說在HOST模式下可以做普通GPIO口使用,但是不知道怎么使用 希望有TI專家幫忙解答一下!謝謝!… 查看全部問答∨ |
總體感覺使用方法跟傳統的相同接口的EEPROM方式一樣,程序兼容,另外發現無壞塊,EEPROM通常會有一些壞塊,我以前遇到過幾次,程序中要添加測試壞塊的代碼,另外還要使用程序進行屏蔽,FRAM卻可以保證每個存儲bit都是良好的,這在存儲效率上大大提 ...… 查看全部問答∨ |