欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
STM32注入多通道采集ADC 源程序
[打印本頁]
作者:
孟榜鑫
時(shí)間:
2020-9-18 09:49
標(biāo)題:
STM32注入多通道采集ADC 源程序
無意間看到網(wǎng)上有網(wǎng)友分享ADC注入組采集數(shù)據(jù)的文章,然后自己試著去配置代碼,翻遍了所有的網(wǎng)頁說明幾乎千篇一律并沒有一個(gè)實(shí)用用的例程,然后就花了一天的時(shí)間去研究庫函數(shù),搞了很久都不可以,最終功夫不負(fù)有心人人我調(diào)出來了 看看我的代碼 不需要DMA搬運(yùn):
單片機(jī)代碼:
#include "stm32f10x.h"
#include "adc.h"
void Adc_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定義一個(gè)結(jié)構(gòu)體變量
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PA時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能ADC1時(shí)鐘
RCC_ADCCLKConfig(RCC_PCLK2_Div2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//引腳選擇
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬模式
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //獨(dú)立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //單通道模式(非掃描模式)
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //單次轉(zhuǎn)換模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //軟件觸發(fā)啟動(dòng)
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC數(shù)據(jù)右對(duì)齊
ADC_InitStructure.ADC_NbrOfChannel = 1; //順序轉(zhuǎn)換的ADC通道的數(shù)目
ADC_Init(ADC1,&ADC_InitStructure); //初始化ADC1
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1); //使能復(fù)位校準(zhǔn)
while(ADC_GetResetCalibrationStatus(ADC1)); //等待復(fù)位校準(zhǔn)結(jié)束
ADC_StartCalibration(ADC1); //開啟AD校準(zhǔn)
while(ADC_GetCalibrationStatus(ADC1)); //等待校準(zhǔn)結(jié)束
}
u16 ADC1_CH_Data(u8 ch)
{
ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);//設(shè)置規(guī)則轉(zhuǎn)換通道
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能軟件轉(zhuǎn)換啟動(dòng)功能
ADC_Cmd(ADC1,ENABLE); //使能ADC
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待轉(zhuǎn)換結(jié)束
return ADC_GetConversionValue(ADC1);//讀取轉(zhuǎn)換值
}
/************注入組**************/
void ADC_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定義一個(gè)結(jié)構(gòu)體變量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PA時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//引腳選擇
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬模式
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化
}
/****************************
注入通道配置
*****************************/
void Adc_Init_intput(void)
{
ADC_GPIO();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能ADC1時(shí)鐘
RCC_ADCCLKConfig(RCC_PCLK2_Div2);//時(shí)鐘分頻
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作在獨(dú)立模式,和ADC2不配合
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //單通道模式,不掃描
ADC_InitStructure.ADC_ContinuousConvMode =DISABLE; //單次轉(zhuǎn)換
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //數(shù)據(jù)右對(duì)齊
ADC_Init(ADC1, &ADC_InitStructure);
/*********** ADC1 注入通道的配置! ************/
ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigInjecConv_None); //外部觸發(fā)源為軟件觸發(fā)
ADC_InjectedSequencerLengthConfig(ADC1, 1); //注入轉(zhuǎn)換通道1個(gè)
ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_1,0);
ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_2,0);
ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_3,0);
ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE);//使能注入組轉(zhuǎn)換功能
ADC_AutoInjectedConvCmd(ADC1,ENABLE);//使能轉(zhuǎn)換規(guī)則組后轉(zhuǎn)換注入組功能
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1); //使能復(fù)位校準(zhǔn)
while(ADC_GetResetCalibrationStatus(ADC1)); //等待復(fù)位校準(zhǔn)結(jié)束
ADC_StartCalibration(ADC1); //開啟AD校準(zhǔn)
while(ADC_GetCalibrationStatus(ADC1)); //等待校準(zhǔn)結(jié)束
ADC_TempSensorVrefintCmd(ENABLE); //開啟內(nèi)部溫度傳感器
}
u16 ADC1_CH_Intput_Data(u8 ch)
{
ADC_InjectedChannelConfig(ADC1,ch,1,ADC_SampleTime_28Cycles5);//設(shè)置規(guī)則轉(zhuǎn)換通道
ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE);//使能軟件轉(zhuǎn)換啟動(dòng)功能
ADC_Cmd(ADC1,ENABLE); //使能ADC
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待轉(zhuǎn)換結(jié)束
return ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);//讀取轉(zhuǎn)換值
}
//中位值濾波
//方法:連續(xù)采樣N次(N取奇數(shù))把N次采樣值按大小排列取中間值為本次有效值
//優(yōu)點(diǎn):能有效克服因偶然因素引起的波動(dòng)干擾;對(duì)溫度、液位等變化緩慢的被測(cè)參數(shù)有良好的濾波效果
//缺點(diǎn):對(duì)流量,速度等快速變化的參數(shù)不宜
#define N 30
u16 middleValueFilter(u8 ch) //會(huì)獲取30個(gè)ADC轉(zhuǎn)換值,然后取中間的一個(gè)作為本次采樣周期的輸出值
{
u16 value_buf[N];
u16 i,j,k,temp;
for( i = 0; i < N; ++i)
{
value_buf[i] = ADC1_CH_Intput_Data(ch) ;
}
for(j = 0 ; j < N-1; ++j)
{
for(k = 0; k < N-j-1; ++k)
{
//從小到大排序,冒泡法排序
if(value_buf[k] > value_buf[k+1])
{
temp = value_buf[k];
value_buf[k] = value_buf[k+1];
value_buf[k+1] = temp;
}
}
}
return value_buf[(N-1)/2];
}
#define V25 1370
#define Avg_Slope 4.35
float Get_InternalSensorTemperate(void) //獲取內(nèi)部溫度傳感器溫度值
{
int ADC_ConvertedValue;//用來存儲(chǔ)ADC轉(zhuǎn)換出來的值
float Current_Temp;
ADC_ConvertedValue = middleValueFilter(16) ; //30次取平均
ADC_ConvertedValue = (ADC_ConvertedValue*825)>>10;//換算成Vsensor
Current_Temp = (((V25-ADC_ConvertedValue)/Avg_Slope)+25); //計(jì)算溫度值
return Current_Temp;
}
復(fù)制代碼
全部資料51hei下載地址:
ADC - 注入組.7z
(181.88 KB, 下載次數(shù): 94)
2020-9-18 14:34 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
940387263
時(shí)間:
2022-1-23 17:03
6666孟工可以啊
作者:
45555555
時(shí)間:
2022-3-1 20:26
你好,我想要做測(cè)足底壓力來進(jìn)行人體姿態(tài)分析,可以交流一下嗎
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1