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

📄 code_fun.c

📁 电动车电流流量计显示程序. 单片机根据采样电阻采得电流后通过数码管显示当前电流是多少安培.
💻 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 + -