資源簡介
基于STM32的心率傳感器設(shè)計代碼 mdk代碼完整可用 注釋充分 包含界面
代碼片段和文件信息
#include?“adc.h“
#include?“delay.h“ ?
//初始化ADC
//我們默認(rèn)僅開啟ADC1_CH5 ???
void??Adc_Init(void)
{????
//先初始化IO口
? RCC->APB2ENR|=1<<8;???? //使能ADC1時鐘?
RCC->AHB1ENR|=1<<0;???? //使能PORTA時鐘 ??
GPIO_Set(GPIOAPIN5GPIO_MODE_AIN00GPIO_PUPD_PU); //PA5模擬輸入下拉???
RCC->APB2RSTR|=1<<8;??? //ADCs復(fù)位
RCC->APB2RSTR&=~(1<<8); //復(fù)位結(jié)束 ?
ADC->CCR=3<<16; ???? //ADCCLK=PCLK2/4=84/4=21MhzADC時鐘最好不要超過36Mhz
?
ADC1->CR1=0;??? ??? //CR1設(shè)置清零
ADC1->CR2=0;??? ??//CR2設(shè)置清零
ADC1->CR1|=0<<24;?????//12位模式
ADC1->CR1|=0<<8;???? //非掃描模式
ADC1->CR2&=~(1<<1);???? //單次轉(zhuǎn)換模式
? ADC1->CR2&=~(1<<11);??? //右對齊
ADC1->CR2|=0<<28;????? //軟件觸發(fā)
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=0<<20;????? //1個轉(zhuǎn)換在規(guī)則序列中?也就是只轉(zhuǎn)換規(guī)則序列1? ???
//設(shè)置通道5的采樣時間
ADC1->SMPR2&=~(7<<(3*5));//通道5采樣時間清空 ??
? ADC1->SMPR2|=7<<(3*5);? ?//通道5??480個周期提高采樣時間可以提高精確度 ?
? ADC1->CR2|=1<<0; ???????//開啟AD轉(zhuǎn)換器 ??
} ??
//獲得ADC值
//ch:通道值?0~16
//返回值:轉(zhuǎn)換結(jié)果
u16?Get_Adc(u8?ch)???
{
//設(shè)置轉(zhuǎn)換序列 ?? ?
ADC1->SQR3&=0XFFFFFFE0;//規(guī)則序列1?通道ch
ADC1->SQR3|=ch; ?? ????
ADC1->CR2|=1<<30;???????//啟動規(guī)則轉(zhuǎn)換通道?
while(!(ADC1->SR&1<<1));//等待轉(zhuǎn)換結(jié)束 ? ???
return?ADC1->DR; //返回adc值
}
//獲取通道ch的轉(zhuǎn)換值,取10次冒泡排序,掐頭去尾,取平均
u16?Get_Adc_Average(u8?ch)
{
u8?ij;
u16?buff[10]={0};
u16?temp;
for(i=0;i<10;i++)
{
buff[i]=Get_Adc(ch);????//讀取轉(zhuǎn)換結(jié)果
}
/*?把讀取值的數(shù)據(jù)按從小到大的排列?*/
for(i=0;i<9;i++)
{
for(j=0;j<9-i;j++)
{
if(buff[j]>buff[j+1])
{
temp?=?buff[j];
buff[j]?=?buff[j+1];
buff[j+1]?=?temp;
}
}
}
/*?求平均值?*/
temp=0;
for(i=1;i<9;i++)
{
temp+=buff[i];
}
return?temp/8;
}
- 上一篇:后臺根據(jù)時間段查詢插件
- 下一篇:USB轉(zhuǎn)CAN總線
評論
共有 條評論