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