?? adc.c
字號(hào):
#include <stm32f10x_lib.h>
#include "adc.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
//Mini STM32開(kāi)發(fā)板
//ADC 驅(qū)動(dòng)代碼
//正點(diǎn)原子@ALIENTEK
//技術(shù)論壇:www.openedv.com
//修改日期:2010/6/7
//版本:V1.0
//版權(quán)所有,盜版必究。
//Copyright(C) 正點(diǎn)原子 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//初始化ADC
//這里我們僅以規(guī)則通道為例
//我們默認(rèn)將開(kāi)啟通道0~3
void Adc_Init(void)
{
//先初始化IO口
RCC->APB2ENR|=1<<2; //使能PORTA口時(shí)鐘
GPIOA->CRL&=0XFFFF0000;//PA0 1 2 3 anolog輸入
//通道10/11設(shè)置
RCC->APB2ENR|=1<<9; //ADC1時(shí)鐘使能
RCC->APB2RSTR|=1<<9; //ADC1復(fù)位
RCC->APB2RSTR&=~(1<<9);//復(fù)位結(jié)束
RCC->CFGR&=~(3<<14); //分頻因子清零
//SYSCLK/DIV2=12M ADC時(shí)鐘設(shè)置為12M,ADC最大時(shí)鐘不能超過(guò)14M!
//否則將導(dǎo)致ADC準(zhǔn)確度下降!
RCC->CFGR|=2<<14;
ADC1->CR1&=0XF0FFFF; //工作模式清零
ADC1->CR1|=0<<16; //獨(dú)立工作模式
ADC1->CR1&=~(1<<8); //非掃描模式
ADC1->CR2&=~(1<<1); //單次轉(zhuǎn)換模式
ADC1->CR2&=~(7<<17);
ADC1->CR2|=7<<17; //軟件控制轉(zhuǎn)換
ADC1->CR2|=1<<20; //使用用外部觸發(fā)(SWSTART)!!! 必須使用一個(gè)事件來(lái)觸發(fā)
ADC1->CR2&=~(1<<11); //右對(duì)齊
ADC1->CR2|=1<<23; //使能溫度傳感器
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1&=0<<20; //1個(gè)轉(zhuǎn)換在規(guī)則序列中 也就是只轉(zhuǎn)換規(guī)則序列1
//設(shè)置通道0~3的采樣時(shí)間
ADC1->SMPR2&=0XFFFFF000;//通道0,1,2,3采樣時(shí)間清空
ADC1->SMPR2|=7<<9; //通道3 239.5周期,提高采樣時(shí)間可以提高精確度
ADC1->SMPR2|=7<<6; //通道2 239.5周期,提高采樣時(shí)間可以提高精確度
ADC1->SMPR2|=7<<3; //通道1 239.5周期,提高采樣時(shí)間可以提高精確度
ADC1->SMPR2|=7<<0; //通道0 239.5周期,提高采樣時(shí)間可以提高精確度
ADC1->SMPR1&=~(7<<18); //清除通道16原來(lái)的設(shè)置
ADC1->SMPR1|=7<<18; //通道16 239.5周期,提高采樣時(shí)間可以提高精確度
ADC1->CR2|=1<<0; //開(kāi)啟AD轉(zhuǎn)換器
ADC1->CR2|=1<<3; //使能復(fù)位校準(zhǔn)
while(ADC1->CR2&1<<3); //等待校準(zhǔn)結(jié)束
//該位由軟件設(shè)置并由硬件清除。在校準(zhǔn)寄存器被初始化后該位將被清除。
ADC1->CR2|=1<<2; //開(kāi)啟AD校準(zhǔn)
while(ADC1->CR2&1<<2); //等待校準(zhǔn)結(jié)束
//該位由軟件設(shè)置以開(kāi)始校準(zhǔn),并在校準(zhǔn)結(jié)束時(shí)由硬件清除
}
//獲得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)
{
//設(shè)置轉(zhuǎn)換序列
ADC1->SQR3&=0XFFFFFFE0;//規(guī)則序列1 通道ch
ADC1->SQR3|=ch;
ADC1->CR2|=1<<22; //啟動(dòng)規(guī)則轉(zhuǎn)換通道
while(!(ADC1->SR&1<<1));//等待轉(zhuǎn)換結(jié)束
return ADC1->DR; //返回adc值
}
//得到ADC采樣內(nèi)部溫度傳感器的值
//取10次,然后平均
u16 Get_Temp(void)
{
u16 temp_val=0;
u8 t;
for(t=0;t<10;t++)
{
temp_val+=Get_Adc(TEMP_CH);
delay_ms(5);
}
return temp_val/10;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -