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

📄 parameter_count.c

📁 汽车测功机源肛码.单片机用的是LPC2104. 实现测速,对涡流机的控制,马达的控制.
💻 C
字号:
#include "CGJ.H"
#include "control.h"

 
/**********************************************************************************************************
* 函数名称: count_speed
* 功    能: 计算速度
* 入口参数: 无
* 出口参数: 无
* 调用模块: 无
* 全局变量: mcs         上一个周期抓取到的脉冲数
*           mczq        上一个周期抓取到的所有脉冲的总的周期
*           parameter   参数全局数组变量
*-----------------------------------------------------------------------------------------------------------
* 设计者:   饶阳胜
* 日    期: 05-7-10
*-----------------------------------------------------------------------------------------------------------
* 说    明:
*           1 此函数最好0.1秒调用一次.
*           2 最好能做到根据上一次的速度来决定调用此函数的频率
*               例如: 如果上一次速度比较大,则此函数可以调用的频繁的一点.
*                     而相应的,如果上一次的速度比较小,则此函数的调用频率则要慢一点
*************************************************************************************************************/
void CountSpeed(void)
{
    FP32    speed;
    FP32    distance;                                       // 行驶距离m
    FP32    mczq_copy, mcs_copy;
    
    OS_ENTER_CRITICAL();                                    // 关闭中断
        mczq_copy     = mczq;                                 // 取得全局变量值
        mcs_copy      = mcs;
        G_PulseCount += mcs_copy;

        mczq        = 0;                                    // 修改全局变量值
        mcs         = 0;
    OS_EXIT_CRITICAL();                                     // 开中断
    
    if(mcs_copy < 1){                                       // 如果上一个周期取到的脉冲数少于1个,速度强制清0
        speed   = 0;
    }else{
        speed   = speed_parameter * mcs_copy / mczq_copy;   // 计算速度
    }

    //行驶距离
    distance = G_PulseCount * gtzj_mm * 3.14159 / mcmcs / 1000;

    OS_ENTER_CRITICAL();                                    // 关中断
        ScSpeed = speed;
        parameter[SPEED]    = speed;
        parameter[DISTANCE] = distance;
    OS_EXIT_CRITICAL();                                     // 开中断
}

/**********************************************************************************************************
* 函数名称: CountForce()
* 功    能: 计算力,功率
* 入口参数: 无
* 出口参数: 无
* 调用模块: 无
* 全局变量: parameter   参数全局数组变量
*-----------------------------------------------------------------------------------------------------------
* 设计者:   周川福
* 日    期: 06-4-14
*-----------------------------------------------------------------------------------------------------------
* 说    明:
*           1 此函数在此应用是每0.01秒调用一次,用做调整可控硅输出的依据
*************************************************************************************************************/
void CountForce(void)
{
    FP32            force;
    FP32            AdDif, ValueDif;
    INT8U           i, j;
    INT16U          now_adi;
    
//    now_adi     = adi_value;                                        // 得到当前AD值
//    now_adi     = GetAverAD();
    now_adi     = GetForceAD();
    force       = 0;
    
    if( CGJDemaNumber < 2 ) {
        parameter[FORCE] = 0.0;
        return;
    }

    if((now_adi <= CGJDemaPointTbl[0].ad_value) || (now_adi >= 0x8000)){        // 如果当前力小于0点或输入电压为负值,则强制将力清0,
        force = 0;                                                              // 0x8000的由来->AD976芯片当输入电压为负值,值大于0x8000 
    }else{

        j = 0;
        for(i=0; i<CGJDemaNumber; i++) {
            j = i;
            if( now_adi < CGJDemaPointTbl[i].ad_value ) 
                break;
        }

        if(j == 0) 
            j = 1;

        AdDif    = CGJDemaPointTbl[j].ad_value - CGJDemaPointTbl[j-1].ad_value;
        ValueDif = CGJDemaPointTbl[j].set_value - CGJDemaPointTbl[j-1].set_value;

        if( AdDif != 0 ) {
            force = CGJDemaPointTbl[j-1].set_value + (now_adi - CGJDemaPointTbl[j-1].ad_value) * ValueDif / AdDif;
                                                     
        }else {
            force = CGJDemaPointTbl[j-1].set_value;
        }
        
        
    }
    
    parameter[FORCE] = force;                                     // 给全局的力和功率赋值
    
}

/**********************************************************************************************************
* 函数名称: CountSpeedParameter()
* 功    能: 计算速度参数
* 入口参数: 无
* 出口参数: 无
* 调用模块: 无
* 全局变量: 
*-----------------------------------------------------------------------------------------------------------
* 设计者:   饶阳胜
* 日    期: 05-8-29
*-----------------------------------------------------------------------------------------------------------
* 说    明:
*           
*************************************************************************************************************/
void CountSpeedParameter()
{
    FP32    temp;

    temp = gtzj_mm;
    temp = temp / 1000 * 3.1415926;             // 将滚筒直径转换成以M为单位
    
    temp = 1000.0 / 3600.0 / temp;              // 当滚筒以100Km/h的速度旋转时,每秒钟所转动的圈数
    temp *= mcmcs;                              // 当滚筒以100Km/h的速度旋转时,每秒种所转过的齿数
    
    OS_ENTER_CRITICAL();
    
    speed_parameter = 11059200.0 / temp;        // 得到每转动一个齿所要花的时间
    
    OS_EXIT_CRITICAL();
}


/********************************************************************************
* 函数名称: 
* 功    能: 
* 入口参数: 
* 出口参数: 
* 调用模块: 
*
* 全局变量: 
*           
*--------------------------------------------------------------------------------
* 设计者:   
* 日    期: 
* 说    明: 
********************************************************************************/
INT32U GetForceAD()
{
    INT32U  adi_temp, sum_ad;
    INT16U  i, k;
    
    sum_ad = 0;

    for(k = 0; k < 8; k++) {

        for(i=50; i>0; i--);

        IOCLR = AD_RC;                                  // 向AD976A发出开始转换指令
        for(i=2;i>0;i--);
        IOSET = AD_RC;                                  // 向AD976A发出读取转换结果指令

        for(i = 50; i > 0; i--) {                      // 延时等待完成
            if((IOPIN & AD_BUSY) > 0)
                break;
        }
    
        adi_temp = 0;

        IOCLR = AD_BYTE;                                // 读取低字节
        adi_temp |= (IOPIN >> 16) & 0xFF;

        IOSET = AD_BYTE;                                // 读取高字节
        adi_temp |= (IOPIN >> 8) & 0xFF00;
        
        if(adi_temp >= 0x8000){
            adi_temp = 0;
        }

        sum_ad += adi_temp;

    }

    adi_temp = sum_ad >> 3;
                
    return adi_temp;
    
}

⌨️ 快捷键说明

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