125 lines
4.2 KiB
C
125 lines
4.2 KiB
C
#include "spi.h"
|
|
void Write_Register(unsigned char COMMAND, unsigned char H_DATA, unsigned char M_DATA, unsigned char L_DATA, unsigned char S_DATA)
|
|
{
|
|
SPI2_ReadWrite(COMMAND);
|
|
SPI2_ReadWrite(H_DATA);
|
|
SPI2_ReadWrite(M_DATA);
|
|
SPI2_ReadWrite(L_DATA);
|
|
SPI2_ReadWrite(S_DATA);
|
|
}
|
|
uint32_t Read_Register(unsigned char COMMAND)
|
|
{
|
|
SPI2_ReadWrite(COMMAND);
|
|
delay_us(1000);
|
|
uint8_t H_DATA = SPI2_ReadWrite(0xFF);
|
|
uint8_t M_DATA = SPI2_ReadWrite(0xFF);
|
|
uint8_t L_DATA = SPI2_ReadWrite(0xFF);
|
|
uint8_t S_DATA = SPI2_ReadWrite(0xFF);
|
|
return H_DATA << 24 | M_DATA << 16 | L_DATA << 8 | S_DATA;
|
|
}
|
|
bool WaitForReady(uint32_t timeout)
|
|
{
|
|
uint32_t count = 0;
|
|
|
|
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) && (count < timeout)) {
|
|
delay_us(1);
|
|
count++;
|
|
}
|
|
|
|
if (count >= timeout) {
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
void RESET_SPI(void)
|
|
{
|
|
SPI2_ReadWrite(0x00);
|
|
SPI2_ReadWrite(0xA5);
|
|
SPI2_ReadWrite(0xFF);
|
|
SPI2_ReadWrite(0x5A);
|
|
}
|
|
#include "APPDEF.H"
|
|
|
|
static void bubbleSort(float *num)
|
|
{
|
|
float temp;
|
|
int i, j;
|
|
for (i = 0; i < 5; i++) {
|
|
for (j = 0; j < 5 - i; j++) {
|
|
if (num[j] > num[j + 1]) {
|
|
// 交换相邻元素的值
|
|
temp = num[j];
|
|
num[j] = num[j + 1];
|
|
num[j + 1] = temp;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
struct uCalibrateWeight CalibrateWeight;
|
|
float WeightData = 0.0f;
|
|
float WeightDatafilter = 0.0f;
|
|
static float bufferdata[5];
|
|
static float dataout[5];
|
|
int32_t ADvalue = 0;
|
|
uint8_t ic = 0;
|
|
int32_t data = 0;
|
|
|
|
void GET_ADC_CH0(const void *p_arg)
|
|
{
|
|
for (;;) {
|
|
osDelay(100);
|
|
// if (WaitForReady(50000)) {
|
|
delay_us(1000);
|
|
ADvalue = Read_Register(0x5A);
|
|
bufferdata[ic++] = ADvalue;
|
|
if (ic >= 3) // 5个数据取中间值
|
|
{
|
|
ic = 0;
|
|
bubbleSort(bufferdata); // 冒泡排序
|
|
// 滑动滤波
|
|
// dataout[4] = dataout[3];
|
|
// dataout[3] = dataout[2];
|
|
dataout[2] = dataout[1];
|
|
dataout[1] = dataout[0];
|
|
dataout[0] = bufferdata[3]; // 取中间值
|
|
bufferdata[0] = bufferdata[1] = bufferdata[2] = bufferdata[3] = bufferdata[4] = 0;
|
|
WeightDatafilter = ((dataout[0] + dataout[1] + dataout[2] /*+ dataout[3] + dataout[4]*/) / 3.0);
|
|
WeightData = CalibrateWeight.WeightSlope * ((int32_t)WeightDatafilter - (int32_t)CalibrateWeight.WeightZero);
|
|
}
|
|
// if (ADvalue != -1) {
|
|
// kalman_filter_update(&kf, ADvalue); // 更新步骤
|
|
// WeightDatafilter = kf.x;
|
|
// }
|
|
// WeightDatafilter = kalman_filter_1(ADvalue);
|
|
// WeightData = CalibrateWeight.WeightSlope * ((int32_t)WeightDatafilter - (int32_t)CalibrateWeight.WeightZero);
|
|
// WeightData = (int32_t)(WeightData * 10000) /10000.0f;
|
|
// }
|
|
}
|
|
}
|
|
osThreadDef(GET_ADC_CH0, osPriorityNormal, 1, 0);
|
|
void INIT_CS555X(void)
|
|
{
|
|
SPI2_Configuration();
|
|
osDelay(100);
|
|
RESET_SPI();
|
|
osDelay(100);
|
|
Write_Register(0x30, 0x80, 0x00, 0x00, 0x00); // RESET
|
|
osDelay(100);
|
|
Write_Register(0x00, 0x00, 0x00, 0x00, 0x00); // OS_CH0
|
|
Write_Register(0x09, 0x02, 0x00, 0x00, 0x00); // GAIN_CH0
|
|
Write_Register(0x21, 0x00, 0x00, 0x00, 0xC1); // CONV_CONF0 //PGA=128 DATA RATE=6.25Hz
|
|
// Write_Register(0x28, 0x00, 0x00, 0x00, 0x00); // CONV_CONF1
|
|
Write_Register(0x30, 0x00, 0x01, 0x00, 0x00); // SYS_CONF0 //****************HBF_EN=0;
|
|
Write_Register(0x39, 0x00, 0x11, 0x02, 0x00); // SYS_CONF1 //****************FR_SEL=0;
|
|
Write_Register(0x41, 0x00, 0x02, 0x00, 0x00); // SYS_CONF2
|
|
osDelay(5);
|
|
SPI2_ReadWrite(0x82); // 转换命令帧 正常连续转换
|
|
osDelay(1);
|
|
CalibrateWeight.WeightSlope = 0.0000013f;
|
|
CalibrateWeight.WeightZero = 1425000;
|
|
osThreadCreate(osThread(GET_ADC_CH0), NULL);
|
|
return;
|
|
}
|