先自己建个工程模板用,只添加了IO翻转用于测试,MDK5以上。
共9条
1/1 1 跳转至页
ADC部分设置
void ADC_Init(void)
{
AdcHandle.Instance = ADC1;
AdcHandle.Init.OversamplingMode = DISABLE;
AdcHandle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1;
AdcHandle.Init.LowPowerAutoPowerOff = DISABLE;
AdcHandle.Init.LowPowerFrequencyMode = ENABLE;
AdcHandle.Init.LowPowerAutoWait = DISABLE;
AdcHandle.Init.Resolution = ADC_RESOLUTION_12B;
AdcHandle.Init.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
AdcHandle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
AdcHandle.Init.ContinuousConvMode = ENABLE;
AdcHandle.Init.DiscontinuousConvMode = DISABLE;
AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
AdcHandle.Init.DMAContinuousRequests = DISABLE;
HAL_ADC_Init(&AdcHandle);
HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED);
}
主函数添加
sConfig.Channel = ADC_CHANNEL_0;
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
HAL_ADC_Start(&AdcHandle);
读转换结果
uint32_t READ_ADC(void)
{
uint32_t num;
HAL_ADC_PollForConversion(&AdcHandle, 10);
if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
num=HAL_ADC_GetValue(&AdcHandle);
return num;
}
NTC测温思路,电源、NTC、10K电阻、地 连接AD测中点excel按NTC的B值算出电阻值,为了方便存储记录起始值与之后的差值,转换过程中将温度放大10倍处理回避浮点数。
const int tempoffset=282;//初始值
const unsigned char tempt[155]={
16,16,17,17,19,18,20,21,21,21,23,23,25,24
,26,26,27,28,29,29,30,31,31,33,32,34,34,35
,35,36,36,37,37,38,39,38,39,40,39,40,40,41
,40,41,40,41,41,41,40,41,40,41,40,40,39,40
,39,39,38,38,38,38,36,37,36,35,36,34,34,34
,33,32,32,31,31,31,29,30,28,28,28,27,26,26
,25,25,24,24,23,23,22,22,21,21,20,20,19,19
,18,18,17,17,17,16,16,16,15,14,15,14,13,14
,12,13,12,12,12,11,12,10,11,10,10,10,9,10
,9,9,8,9,8,8,7,8,7,7,7,7,7,6,7,6,6,6,6,5,6
,5,5,5,5,5,5,4,5
};
int32_t search(void)
{
static int32_t temp;
unsigned char i,m,n;
for(i=0;i<10;i++)
{
ADCNUM[i]=READ_ADC();
}
for(m=0;m<9;m++)
for(n=m+1;n<10;n++)
{
if(ADCNUM[m]<ADCNUM[n])
{
ADCNUM[10]=ADCNUM[n];
ADCNUM[n]=ADCNUM[m];
ADCNUM[m]=ADCNUM[10];
}
}
ADCm=ADCNUM[1]+ADCNUM[2]+ADCNUM[3]+ADCNUM[4]+ADCNUM[5]+ADCNUM[6]+ADCNUM[7]+ADCNUM[8];
ADCm=ADCm/8;
ADCm=ADCm-tempoffset;
temp=0-300;
for(i=0;i<155;i++)
{
if(ADCm>=tempt[i])
{
ADCm=ADCm-tempt[i];
temp+=10;
}
else
{
temp+=(ADCm*10)/tempt[i];
break;
}
}
return temp;
}
对AD的处理采用中值滤波的方法初步测试基本满意,为了加快速度可以将取样的次数减少。
共9条
1/1 1 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| OK1126B-S开发板下以导航按键控制云台/机械臂姿态调整被打赏¥29元 | |
| 【树莓派5】便携热成像仪被打赏¥36元 | |
| 【树莓派5】环境监测仪被打赏¥35元 | |
| OK1126B-S开发板下多时段语音提示型电子时钟被打赏¥27元 | |
| OK1126B-S开发板下函数构建及步进电机驱动控制被打赏¥25元 | |
| 【S32K3XX】LPI2C 参数配置说明被打赏¥20元 | |
| OK1126B-S开发板的脚本编程及应用设计被打赏¥27元 | |
| 5v升压8.4v两节锂电池充电芯片,针对同步和异步的IC测试被打赏¥35元 | |
| 【S32K3XX】S32DS LPI2C 配置失败问题解决被打赏¥22元 | |
| 【S32K3XX】FLASH 的 DID 保护机制被打赏¥19元 | |


我要赚赏金
