📄 code_fun.c
字号:
/***********************************************************************
* HEADER_START *
* *
* Name: code_fun.c *
* Project: Sensorless BLDC Motor HC08 *
* Description: main code functions *
* Processor: HC08MR32/24 *
* HW: MC68HC908MR32 MC BOARD 01-RE10144W01 REV B *
* Revision: 2.0 *
* Date: 6th December 2004 *
* Compiler: METROWERKS ANSI-C/cC++ Compiler for HC08 *
* V-5.0.12 ICG *
* Author: Libor Prokop(R30322), Leos Chalupa, Jiri Ryba *
* Company: Motorola SPS *
* Roznov System Application Laboratory *
* Roznov pod Radhostem, Czech Republic *
* Security: General Business Information *
* The BLDC motor start-up algorithm is patented *
* by Motorola patent US6023141. *
* The BLDC commutation and position sensing *
* is patented by Motorola patents WO9821816A1 *
* and US5751128 *
* The patents usage is conditioned with *
* utilization on Motorola MCU/DSP *
* Note: SELECTED ONE OF THREE SUPORTED HW PLATFORM *
* IN THIS FILE: *
* Positive polarity set in MOR register *
* when break with Hiwave all IGBTs are OFF !!! *
* *
* =================================================================== *
* Copyright (c): MOTOROLA Inc.,2004, All rights reserved. *
* *
* =================================================================== *
* THIS SOFTWARE IS PROVIDED BY MOTOROLA RSAL "AS IS" AND ANY *
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE *
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR *
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MOTOROLA RSAL OR *
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, *
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT *
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) *
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, *
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) *
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED *
* OF THE POSSIBILITY OF SUCH DAMAGE. *
* =================================================================== *
*
* HEADER_END
*/
/******************************************************************************
* N O T E: *
* *
* ONE OF THREE SUPORTED HW PLATFORM MUST BE SELECTED IN THIS FILE AFTER THE *
* LABEL "SELECT_HW_PLATFORM" *
* const_cust_hv.h - for High voltage (230/115V) power board and motor set*
* const_cust_evmm.h - for EVM motor board (12V low power) and motor set *
* const_cust_lv.h - for Low voltage (12V) power boardand motor set *
* *
******************************************************************************/
/******************************************************************************/
/* I N C L U D E H E A D E R F I L E S */
/******************************************************************************/
#include "qy2io.h" /* file contains MR32/24 registers definition */
#include "const.h" /* file contains global constants and
definitions */
#include "ram.h" /* file contains RAM global variables
definitions customer related */
#include "code_fun.h" /* file contains function declarations */
#include "tab_cust.h"
/******************************************************************************/
/* FUNCTION DEFINITIONS */
/******************************************************************************/
/*****************************************************************************\
* void InitTimer(void): Init time Register*
* *
* Parameters: None *
* *
* *
* Return: None. *
\*****************************************************************************/
void InitTimer(void){
/* 1.In the TIM status and control register (TSC):
* a. Stop the TIM counter by setting the TIM stop bit, TSTOP.
* b. Reset the TIM counter and prescaler by setting the TIM reset bit, TRST.
*/
//TSC.B.TSTOP = 1;
//TSC.B.TRST = 1;
TSC.R = I_TSC; /* init Timer Status/Cntrl Register start */
/* 2. In the TIM counter modulo registers (TMODH:TMODL), write the value for
* the required PWM period.
*/
TMODH = 0;
TMODL = MCPWM_MODULUS;
/* 3. In the TIM channel x registers (TCHxH:TCHxL), write the value for the required
* pulse width
*/
TCH0 = 0;
/*
* In TIM channel x status and control register (TSC0):
*/
TSC0.R = I_TSC0; /* UNBUFFERED PWM ON TCHO, CLEAR OUTPUT ON
COMPARE, TOGGLE OUTPUT ON OVERFLOW*/
TSC.B.TSTOP = 0; /*Start timer counter*/
}
/************** [END - Wait40us] *********************************/
/************** [BEGIN - Initialize Parameters] ********************************
*
* Function: void ParamInit (void)
*
* Description:
*
* Initialize Motor Parameters
*
* This soubroutines initialize parameters variables to customize to a motor
* acording to defined constants
*
******************************************************************************/
void ParamInit (void) {
/******** Software Timer Initialization *************/
TIMER = 0;
oldShowTime = 0;
T_125ms_Event = 0;
T_125ms = 0;
sumCurrent = 0;
aveCurrent = 0;
TimeShow = 0;
ShowCurrent = 0;
_1sCurrent = 0;
cntCurrent = 0;
CaliCurrent = 0;
Scan_Status.R = 0;
Scan_Status.B.OLDMODETEST = PORTA.B.MODETEST;
T_ModeTest = 0;
Cnt_ModeSet = 0;
Cnt_ModeClr = 0;
/********** Test Offset Current ***********************/
TestOffsetCurrent();
}
/************** [END - Initialize Parameters] *********************************/
/*****************************************************************************\
* void DataShow(void): ReadData*
* *
* Parameters: None *
* *
* *
* Return: None. *
\*****************************************************************************/
void DataShow2Bits(unsigned int tempValue) {
unsigned char TenBit;
if( TIMER - oldShowTime < 40 ) {
if( PORTB.B.POWERON ){
PORTA.B.CTRL0 = 1;
PORTA.B.CTRL1 = 0;
tempValue = tempValue/10;
PORTB.R = BCD_Tab[tempValue];
} else {
PORTA.B.CTRL0 = 0;
PORTA.B.CTRL1 = 0;
PORTB.R = 0;
}
} else if( TIMER - oldShowTime < 80 ) {
if( PORTB.B.POWERON ) {
PORTA.B.CTRL0 = 0;
PORTA.B.CTRL1 = 1;
TenBit = (unsigned char) (tempValue/10);
tempValue = tempValue - TenBit * 10 ;
PORTB.R = BCD_Tab[tempValue];
} else {
PORTA.B.CTRL0 = 0;
PORTA.B.CTRL1 = 0;
PORTB.R = 0;
}
} else
oldShowTime = TIMER;
}
/***************************** End of DataShow ********************************/
/*****************************************************************************\
* void DataShowInTest(void): ReadData*
* *
* Parameters: None *
* *
* *
* Return: None. *
\*****************************************************************************/
void DataShowInTest(void) {
if( TIMER - oldWaitTime < _1s ) {
DataShow2Bits(CaliCurrent);
} else if ( TIMER - oldWaitTime < _2s ) {
PORTA.B.CTRL0 = 0;
PORTA.B.CTRL1 = 0;
PORTB.R = 0;
} else
oldWaitTime = TIMER;
}
/************************ end of DataShow In Test *****************************/
/*****************************************************************************\
* void TestOffsetCurrent(void): ReadData*
* *
* Parameters: None *
* *
* *
* Return: None. *
\*****************************************************************************/
void TestOffsetCurrent(void){
unsigned char count;
unsigned int temp_C_Current = 0;
for( count = 0; count < 64; count++ ) {
while (ADSCR.B.COCO == 0)
{};
temp_C_Current += ADR;
ADSCR.R = C_Current;
}
Offset_Curr = (unsigned char) ( temp_C_Current >> 6);
}
/************************* end of TestOffsetCurrent **************************/
/*****************************************************************************\
* void TestOffsetCurrent(void): ReadData*
* *
* Parameters: None *
* *
* *
* Return: None. *
\*****************************************************************************/
void ScanModeTest(void) {
if( Scan_Status.B.OLDMODETEST != PORTA.B.MODETEST ) {
if( !PORTA.B.MODETEST ) {
ShowCurrent = 0;
sumCurrent = 0;
CaliCurrent = 0;
Scan_Status.B.INMODETEST = 1;
Scan_Status.B.MODETESTFINISH = 0;
T_ModeTest = T_125ms;
} else {
ShowCurrent = 0;
sumCurrent = 0;
Scan_Status.B.INMODETEST = 0;
Scan_Status.B.MODETESTFINISH = 0;
T_ModeTest = 0;
oldWaitTime = 0;
CaliCurrent = 0;
}
}
Scan_Status.B.OLDMODETEST = PORTA.B.MODETEST;
}
/******************** Scan Mode Test ****************************************/
/*****************************************************************************\
* void TestOffsetCurrent(void): ReadData*
* *
* Parameters: None *
* *
* *
* Return: None. *
\*****************************************************************************/
void ScanModePORT(void) {
if( Scan_Status.B.OLDMODETEST ) {
if( !PORTA.B.MODETEST ) {
if( ++Cnt_ModeSet == PORTDELAY_BEG ) {
Cnt_ModeSet = 0;
ShowCurrent = 0;
sumCurrent = 0;
CaliCurrent = 0;
Scan_Status.B.INMODETEST = 1;
Scan_Status.B.MODETESTFINISH = 0;
T_ModeTest = T_125ms;
Scan_Status.B.OLDMODETEST = 0;
}
} else
Cnt_ModeSet = 0;
Cnt_ModeClr = 0;
} else {
if( PORTA.B.MODETEST ) {
if( ++Cnt_ModeClr == PORTDELAY ) {
Cnt_ModeClr = 0;
ShowCurrent = 0;
sumCurrent = 0;
Scan_Status.B.INMODETEST = 0;
Scan_Status.B.MODETESTFINISH = 0;
T_ModeTest = 0;
oldWaitTime = 0;
CaliCurrent = 0;
Scan_Status.B.OLDMODETEST = 1;
}
} else
Cnt_ModeClr = 0;
Cnt_ModeSet = 0;
}
}
/******************** Scan Mode Test ****************************************/
/*****************************************************************************\
* void TestOffsetCurrent(void): ReadData*
* *
* Parameters: None *
* *
* *
* Return: None. *
\*****************************************************************************/
void ModeTest(void) {
if( !PORTA.B.MODETEST )
if( Scan_Status.B.INMODETEST && T_ModeTest && T_125ms - T_ModeTest > /*64*/128 ) {
T_ModeTest = 0;
oldWaitTime = TIMER;
CaliCurrent = ShowCurrent;
Scan_Status.B.INMODETEST = 0;
Scan_Status.B.MODETESTFINISH = 1;
}
}
/******************** Scan Mode Test ****************************************/
/*****************************************************************************\
* void wait_ms(byte milis): Delay routine that waits for a number of milli- *
* seconds send in the parameter milis. the delay *
* is calculated for a 3.2 MHz Fbus operation. *
* *
* Parameters: milis. A 8 bit value representing the number of milliseconds the*
* delay will wait. *
* *
* Return: None. *
\*****************************************************************************/
void WaitMs(unsigned char milis)
{
unsigned char wait40usCount; // used for counting wait40us delay
do{
for(wait40usCount = 0; wait40usCount < 20; wait40usCount++)
Wait40us();
}while((--milis) != 0);
}
/************** [END - WaitMs] *********************************/
/*****************************************************************************\
* void wait40us(void): An instant of time of which the wait_ms() subroutine is*
* based on. *
* *
* Parameters: None *
* *
* *
* Return: None. *
\*****************************************************************************/
void Wait40us(void){
unsigned char count = 103; // Value for 40us delay at Fbus = 8 MHz
do{
}while(--count);
}
/************** [END - Wait40us] *********************************/
/*****************************************************************************\
* void wait40us(void): An instant of time of which the wait_ms() subroutine is*
* based on. *
* *
* Parameters: None *
* *
* *
* Return: None. *
\*****************************************************************************/
void WaitNus(unsigned char count){
do{
}while(--count);
}
/*************************** [END - Wait40us] *********************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -