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

📄 dema.c

📁 汽车测功机源肛码.单片机用的是LPC2104. 实现测速,对涡流机的控制,马达的控制.
💻 C
字号:
/**************************************************************************************************
* 文件名:   dema.c
* 说    明:
*           目前设计的所有函数针对只有一个标定对象 => 力
*           如果以后需要增加新的标定对象,再对程序进行修改
**************************************************************************************************/
#include "CGJ.H"                                        // 包含项目头文件
#include "I2C.H"                                        // 包含I2C头文件
#include "control.h"                                    // 包含控制头文件

#define NO_EXIST_POINT  0xFF                            // 不可能存在的标定点的关键字
/**************************************************************************************************
* 函数名称: DemaPointBlockInit()
* 功    能: 系统上电复位时,初始化驱动力标定数据表。
* 入口参数: 
* 出口参数: 
*
* 调用模块: OS_ENTER_CRITICAL()     关中断宏
*           OS_EXIT_CIRTICAL()      开中断宏
*
* 全局变量: 
*           CGJDemaNumber           标定点数
*           CGJDemaPointTbl[]       标定点数据表
*
* 设计者:   周川福
* 日    期: 06-4-13
* 说    明:
**************************************************************************************************/
void DemaPointBlockInit(void)
{
    INT8U   i;                                                  // 临时变量
    
            
    OS_ENTER_CRITICAL();                                        // 下面要对全局变量进行操作,关中断
        for(i=0; i<DEMA_POINT_NUMBER; i++) {
            CGJDemaPointTbl[i].id        = i;
            CGJDemaPointTbl[i].ad_value  = 0;
            CGJDemaPointTbl[i].set_value = 0;
            CGJDemaPointTbl[i].valid     = FALSE;
        }

        CGJDemaNumber = 0;

    OS_EXIT_CRITICAL();                                         // 开中断
}


/****************************************************************************************************
* 函数名称: InsertDemaPoint()
* 功    能: 向标定表中插入一个标定点
* 入口参数: number                  当前标定点的序号
*           ad_value                当前标定点的AD值
*           set_value               当前标定点的设定值(力)
*
* 出口参数: 
* 调用模块: 
* 全局变量: CGJDemaPointTbl         驱动力标定数据表
*           CGJDemaNumber           驱动力标定点数
* 设计者:   周川福
* 日    期: 06-4-13
* 说    明: 把标定数据插入标定数据表
*           
****************************************************************************************************/ 
INT8U   InsertDemaPoint(INT8U number, INT32S ad_value, INT32U set_value)
{
    INT8U   i;


    //如果是第0点,则清空以前所以的标定数据
    if( number == 0 ) {
        OS_ENTER_CRITICAL();    // 关中断
            //标定数据清除
            for(i=0; i<DEMA_POINT_NUMBER; i++) {
                
                CGJDemaPointTbl[i].id        = i;
                CGJDemaPointTbl[i].ad_value  = 0;
                CGJDemaPointTbl[i].set_value = 0;
                CGJDemaPointTbl[i].valid     = FALSE;
            }
            //标定的点数归零
            CGJDemaNumber = 0;

        OS_EXIT_CRITICAL();    // 开中断
    }        

    
    OS_ENTER_CRITICAL();       // 关中断
        
        if( CGJDemaPointTbl[number].valid == FALSE ) {
            CGJDemaNumber++;
            CGJDemaPointTbl[number].ad_value  = ad_value;
            CGJDemaPointTbl[number].set_value = set_value;
            CGJDemaPointTbl[number].valid     = TRUE;
        }else {
            CGJDemaPointTbl[number].ad_value  = ad_value;
            CGJDemaPointTbl[number].set_value = set_value;
        }

    OS_EXIT_CRITICAL();        // 开中断

    return  DEMA_INSERT_SUCCESS;
       
}

/******************************************************************************************************
* 函数名称: AdjustDemaPoint() 
* 功    能: 调整标定点
* 入口参数: 无
* 出口参数: ADJUST_ZER0_COMPLETE    标定点0点调整完成
* 调用模块: 无
* 全局变量: CGJDemaPointTbl         力标定数据表
            CGJDemaNumber           力标定点数
*           adi_value               AD值
* 设计者:   周川福
* 日    期: 06-4-13
* 说    明: 清0
******************************************************************************************************/
INT8U AdjustDemaPoint(void)
{
    INT8U           i;                                       // 两个0点之间的差值
    INT32S          part;
    
    
    OS_ENTER_CRITICAL();                                        // 关中断
        part = GetForceAD() - CGJDemaPointTbl[0].ad_value;
    //    part = adi_value - CGJDemaPointTbl[0].ad_value;

        for(i=0; i<CGJDemaNumber; i++) {
            CGJDemaPointTbl[i].ad_value += part;
        }

    OS_EXIT_CRITICAL();                                         // 开中断

    return (CLEAR_ZERO_COMPLETE);                              // 返回相关信息
}

/******************************************************************************************************
* 函数名称: DemaTask()
* 功    能: 标定
* 入口参数: 
* 出口参数:
* 调用模块: OSFlagPend()            等待事件标志组函数
*           CountParameter()        计算参数函数
*           SendProgramRunStatus()  向上位机发送程序运行状态函数
*           OSTaskDel()             删除任务函数
*           AdjustDemaPoint()       调整标定点函数
* 全局变量:
* 设计者:   饶阳胜
* 日    期: 05-7-1
* 说    明: 
*******************************************************************************************************/
void DemaTask(void *pdata)
{
    INT8U       i, time, c, send_buffer[5];
    INT8U       err, dema_serial_point;                                         // 错误提示头键字
    INT32S      now_adi;
    INT32U      set_value;      
    BOOLEAN     begin, over;                                    // 标定任务开始,结束运行布尔变量
    OS_FLAGS    flag;                                           // 事件标志组变量                       

    while(1){
        begin = FALSE;                                          // 任务开始运行布尔变量初始化
        while(1){
            flag = OSFlagPend(task_status,                      // 调用等事件标志组函数,没有相应的事件标志组,任务挂起
                              DEMA_FLAG,
                              OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME,   
                              0,
                              &err);
            switch(flag){                                       // 依据收到的不同事件标志做出不同的处理
                case ENTER_DEMA:                                // 进入标定

                    OS_ENTER_CRITICAL();

                    OSTaskSuspend(WAIT_TASK_PRIO);                  // 挂起等待任务
                    OSTaskSuspend(SPEED_TASK_PRIO);                 // 挂起速度任务
                    OSTaskSuspend(FORCE_TASK_PRIO);                 // 挂起力任务
                    OSTaskSuspend(POWER_TASK_PRIO);                 // 挂起功率任务
                    OSTaskSuspend(ROAD_SIMUL_TASK_PRIO);            // 挂起道路模拟任务

                    OS_EXIT_CRITICAL();

                    begin = TRUE;                               // 任务开始布尔变量置1
                    SendProgramRunStatus(ENTER_DEMA_STATUS);    // 向上位机发送进入标定状态信息
                    break;
                case FORCE_CLEAR:                               // 调整标定点
                    
                    SendProgramRunStatus(AdjustDemaPoint());    // 调用调整标定点函数,并将执行状态送到上位机
                    SendProgramRunStatus(WriteEEPROM());        // 调用写EEPROM函数,并将结果发送上位机
                    
                    break;
                default:
                    break;
            }
            if(begin == TRUE) break;                            // 如果已收到开始标定指令,则退出此循环
        }
        over = FALSE;                                           // 初始化结束布尔变量
        time = 0;
        
        while(1){
            OS_ENTER_CRITICAL();
          //  now_adi     = GetAverAD();
          //  now_adi  = adi_value;
            now_adi = GetForceAD();
            OS_EXIT_CRITICAL();
            if(++time >= SEND_DELAY_TIME){
                time = 0;
                c = 0;
                c += '*';
                c += 'Y';
                send_buffer[0] = now_adi / 10000 + '0';
                send_buffer[1] = now_adi % 10000 / 1000 + '0';
                send_buffer[2] = now_adi % 1000 / 100 + '0';
                send_buffer[3] = now_adi % 100 / 10 + '0';
                send_buffer[4] = now_adi % 10 + '0';
                OSMutexPend(uart0,0,&err);                              // 等互斥型信号量   
                CommPutChar(COMM1,'*', 0);  
                CommPutChar(COMM1,'Y',0);
                for(i = 0; i < 5; i++){
                    c += send_buffer[i]; 
                    CommPutChar(COMM1,send_buffer[i],0);
                }
                CommPutChar(COMM1, c, 0);
                CommPutChar(COMM1,'\r',0);
                if((U0IER & 0x02) == 0){                            // 如果发送中断是关的
                    U0IER |= 0x02;                                  // 开发送中断
                    U0THR = CommGetTxChar(COMM1, &err);             // 往发送寄存器写初始值
                }
                OSMutexPost(uart0);
            }
            flag = OSFlagAccept(task_status,                        // 调用等事件标志组函数
                              DEMA_FLAG,
                              OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME,
                              &err);
            switch(flag){                                       // 依据不同的事件做不同的处理
                case FORCE_DEMA:                                // 标定一个点命令
                    OSTimeDly(TASK_DELAY_TIME);                 // 为了得到最新的AD值,调用此函数
                    
                 //   now_adi           = GetAverAD();
                    now_adi           = GetForceAD();  
                    dema_serial_point = force_dema_point;
                    set_value         = (INT32U)set_control_value;
                    
                    err = InsertDemaPoint(dema_serial_point,now_adi,set_value); // 调用插入一个标定点的函数
                    SendProgramRunStatus(err);                  // 向上位机送出程序执行状态
                    break;
                case EXIT_DEMA:                                 // 退出标定命令
                    
                    WriteEEPROM();                              // 调用写EEPROM函数

                    OSTaskResume(FORCE_TASK_PRIO);                          // 唤醒恒力任务
                    OSTaskResume(SPEED_TASK_PRIO);                          // 唤醒恒数任务
                    OSTaskResume(POWER_TASK_PRIO);                          // 唤醒恒功率任务
                    OSTaskResume(ROAD_SIMUL_TASK_PRIO);                     // 唤醒道路模拟阻力任务
                    OSTaskResume(WAIT_TASK_PRIO);                           // 唤醒等待任务

                    SendProgramRunStatus(EXIT_DEMA_STATUS);     // 向上位机发送进入标定状态信息
                    
                    OS_ENTER_CRITICAL();
                        task_status->OSFlagFlags = 0;           // 在退出速度控制前,清除事件标志组                  
                    OS_EXIT_CRITICAL();
                    
                    over = TRUE;                                // 结束布尔变量为有效
                    break;
                default:
                    break;
            }
            if(over == TRUE) break;
            OSTimeDly(TASK_DELAY_TIME);
        }
    }
}

⌨️ 快捷键说明

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