📄 dema.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 + -