先自己建个工程模板用,只添加了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 跳转至页
回复
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |


我要赚赏金
