0 Introduction
不得不再次感叹一下,ddl是第一生产力!!
历经了7天的磨练,这个小东西终于被搞定了。
其实是每天下班后,还不想加班的我,回来完成一个小任务后开始躺尸。
看着群里面的大佬们每天在讨论H5啥啥啥的高端的玩意儿,总觉得自己菜的不行……
言归正传,鹅厂这次搞得【腾讯连连IoT开发大赛】不得不说是个特别好玩的东西
其实作为一个滑坡灾害监测设备的话,一般应该是安装在户外,也就是用4G或者NB-IoT的通讯方式更好。
でもね、手头目前缺少设备- -,就用了上次从鹅厂嫖到的TOS_EVB_G0开发板作为核心。
主要设备:
- TOS_EVB_G0开发板(STM32G0核心 ESP8266通讯模块)
- MIRAN拉绳式位移传感器
- SCA100T倾斜度传感器
接下来是个全家福
先上一个视频
1 硬件工作准备
首先做好硬件开发准备工作,把传感器连接到核心板上,写好驱动代码,读取传感器数值。
1.1 位移传感器工作准备
位移传感器是一个三线制传感器,行程1000mm,供电5-10V(实测3V3工作正常,反正是个滑动变阻器……)
传感器基本上是线性的,所以用ADC读取后,可以直接用公式进行转换
输出端口接到ADC1上,然后在软件中对ADC1进行配置
代码语言:c复制 hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.LowPowerAutoPowerOff = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
hadc1.Init.OversamplingMode = DISABLE;
hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
然后驱动ADC1,读取数值,将其转换成实际位移
代码语言:c复制//读取ADC的值,数据存放在param_dis_adc
HAL_ADC_Start(&hadc1);
HAL_Delay(1000);
printf("Distance:rn");
//获取adc的值
param_dis_adc=HAL_ADC_GetValue(&hadc1);
printf("adc value %d rn", param_dis_adc);
//将ADC的值转换为位移量
adcConvertedDist =(double)param_dis_adc*1000/4096;
printf("dist value %.2f mm rn", adcConvertedDist);
1.2 倾斜度传感器工作准备
倾斜度传感器选用的是SCA100T,这是一个SPI总线的倾斜度传感器
数字式传感器可以有效解决因为噪声导致的干扰
在驱动了板载硬件SPI后,调试未果,便采用了模拟SPI时序的方法进行驱动
以X轴加速度读取为例:
代码语言:c复制CS_ONE();
tos_task_delay(4);
CS_ZERO(); //这一阶段开始读数据
tos_task_delay(4);
for(i=0; i<8; i ){
Temp = RDA & 0X80;
RDA <<= 1;
//开始加载数据
if(Temp == 0x80){SDI_ONE();}
else{SDI_ZERO();}
SCLK_ZERO();
tos_task_delay(4);
SCLK_ONE(); //时钟给定上升沿
tos_task_delay(4);
}
tos_task_delay(4);
for(i=0; i<11; i ){
SCLK_ONE(); //数据在下降沿改变
tos_task_delay(4);
SCLK_ZERO();
tos_task_delay(4);
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)){
ACC_X <<= 1; ACC_X = 1;
}else{
ACC_X <<= 1;
}
}
CS_ONE();
tos_task_delay(4);
最后获得到当前的XY轴加速度,然后根据下面的公式进行换算
其中
然后进行一个计算校准
代码语言:c复制int miay;
miay = (ACC_Y-1024);
Angle_Y = ((float)miay/1638)*180.0/PI;
printf("Angle_Y = %.2frn", Angle_Y);
这里很奇怪的是,直接做减法后强制类型转换得到的结果值有错误……
所以用了个中间变量做转换……疑惑脸