先自己建个工程模板用,只添加了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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |