国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STC32G單片機內(nèi)置ADC及應(yīng)用編程

這篇具有很好參考價值的文章主要介紹了STC32G單片機內(nèi)置ADC及應(yīng)用編程。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一? STC32G單片機內(nèi)置ADC模塊簡介

? ? ? STC32G單片機內(nèi)部集成了一個12位高速ADC轉(zhuǎn)換器,ADC的最高時鐘頻率為系統(tǒng)頻率的1/2。其輸入通道多達(dá)15個(第15通道為專門測量內(nèi)部1.19V參考信號源的通道),可分時切換使用。

? ? ? STC15系列單片機內(nèi)置ADC模塊以電源電源作為ADC參考電壓,STC32G的ADC模塊則與之不同,它有單獨的參考電壓源引腳,可以接入精準(zhǔn)的參考電壓(0~5V皆可),以獲得穩(wěn)定的ADC值;參考電源引腳也可直接與MCU供電電源連接,不過AD轉(zhuǎn)換結(jié)果可能會收到電源電源波動的影響。注意:STC32GADC模塊的參考電壓輸入引腳不可懸空。

? ? ? ?STC32G單片機的內(nèi)置ADC模塊轉(zhuǎn)換結(jié)果存儲在兩個8位寄存器中,可配置為左對齊(高8位存儲在高位寄存器ADC_RES中,低四位存儲在低位寄存器ADC_REL的高四位中),可配置為右對齊(高4位存儲在高位寄存器ADC_RES的低4位中,低8位存儲在低位寄存器ADC_REL中)。

二? STC32G單片機內(nèi)置ADC模塊的相關(guān)寄存器

STC32G單片機內(nèi)置ADC模塊的相關(guān)寄存器包含控制寄存器ADC_CONTR、轉(zhuǎn)換結(jié)果高位寄存器ADC_RES、轉(zhuǎn)換結(jié)果低位寄存器ADC_RESL、配置寄存器ADCCFG、時序控制寄存器ADCTIM。下面是STC用戶手冊對這幾個寄存器的功能介紹。

寄存器ADC_CONTR

STC32G單片機內(nèi)置ADC及應(yīng)用編程STC32G單片機內(nèi)置ADC及應(yīng)用編程

配置寄存器ADCCFG

STC32G單片機內(nèi)置ADC及應(yīng)用編程

STC32G單片機內(nèi)置ADC及應(yīng)用編程

?時序控制寄存器ADCTIM

STC32G單片機內(nèi)置ADC及應(yīng)用編程

?STC32G單片機內(nèi)置ADC及應(yīng)用編程

三? ADC模塊函數(shù)庫編程

? ? ? ?ADC模塊應(yīng)用離不開相關(guān)寄存器編程,先將常用的寄存器配置操作編寫成庫函數(shù)供以后調(diào)用。

? ? ? 頭文件

/*STC32G_ADC.h
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu,7/21/2022
/enum//
STC32G_ADC_CHN         //STC32G ADC channel
STC32G_ADC_SPEED       //STC32G ADC clock frequency
	
/Macro function
STC32G_ADCPOWERON(); 				//adc power on
STC32G_ADCPOWEROFF();			  //adc power off
STC32G_ADCSTART();          //adc start
STC32G_ADCSTOP();					  //adc stop
STC32G_ADCCLEARFLAG():      //clear flag
STC32G_ADCPWMTRIENBLE();    //PWM trigger adc enable
STC32G_ADCPWMTRIDISBLE();		//PWM trigger adc disable

STC32G_ADCSELCH0();  				//selected ADC_CH0
STC32G_ADCSELCH1();  			  //selected ADC_CH1
STC32G_ADCSELCH2();			    //selected ADC_CH2
STC32G_ADCSELCH3();   	    //selected ADC_CH3
STC32G_ADCSELCH4();			    //selected ADC_CH4
STC32G_ADCSELCH5();         //selected ADC_CH5
STC32G_ADCSELCH6();			    //selected ADC_CH6
STC32G_ADCSELCH7();         //selected ADC_CH7
STC32G_ADCSELCH8();         //selected ADC_CH8
STC32G_ADCSELCH9();         //selected ADC_CH9
STC32G_ADCSELCH10();        //selected ADC_CH10
STC32G_ADCSELCH11();        //selected ADC_CH11
STC32G_ADCSELCH12();        //selected ADC_CH12
STC32G_ADCSELCH13();        //selected ADC_CH13
STC32G_ADCSELCH14();        //selected ADC_CH14
STC32G_ADCSELCH15();				//selected ADC_CH15 at inner band gap voltage

STC32G_ADCRESLALIG();				//adc result left alignment
STC32G_ADCRESRALIG():  			//adc result right alignment

//fuanction/
STC32G_AdcSelChn(STC32G_ADC_CHN chn); 					       //return void
STC32G_AdcSelSpeed(STC32G_ADC_SPEED selSpeed);         //return void
STC32G_AdcStructInitDef(STC32G_ADC_TypeDef* pStruct);  //return void
STC32G_AdcInit(STC32G_ADC_TypeDef mStruct);						 //return void
STC32G_AdcGetRes(ui16* pResult);											 //return ui16
*/

#ifndef	__STC32G_ADC_H
#define	__STC32G_ADC_H

#include	"config.h"
#include  "STC32G_GPIO.h"

#define STC32G_ADCPOWERON()          {ADC_POWER = 1;} 				//adc power on
#define STC32G_ADCPOWEROFF() 				 {ADC_POWER = 0;}				  //adc power off
#define STC32G_ADCSTART()            {ADC_START = 1;}         //adc start
#define STC32G_ADCSTOP()             {ADC_START = 0;}					//adc stop
#define STC32G_ADCCLEARFLAG()        {ADC_FLAG = 0;}	        //clear flag
#define STC32G_ADCPWMTRIENBLe()      {ADC_EPWMT = 1;}         //PWM trigger adc enable
#define STC32G_ADCPWMTRIDISBLE()     {ADC_EPWMT = 0;}					//PWM trigger adc disable

#define  STC32G_ADCSELCH0()   {STC32G_P1MODE_HIIN(PIN0); ADC_CONTR &= 0xF0;}  										 //selected ADC_CH0
#define  STC32G_ADCSELCH1()   {STC32G_P1MODE_HIIN(PIN1); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x01;}   //selected ADC_CH1
#define  STC32G_ADCSELCH2()   {STC32G_P1MODE_HIIN(PIN2); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x02;}   //selected ADC_CH2
#define  STC32G_ADCSELCH3()   {STC32G_P1MODE_HIIN(PIN3); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x03;}   //selected ADC_CH3
#define  STC32G_ADCSELCH4()   {STC32G_P1MODE_HIIN(PIN4); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x04;}   //selected ADC_CH4
#define  STC32G_ADCSELCH5()   {STC32G_P1MODE_HIIN(PIN5); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x05;}   //selected ADC_CH5
#define  STC32G_ADCSELCH6()   {STC32G_P1MODE_HIIN(PIN6); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x06;}   //selected ADC_CH6
#define  STC32G_ADCSELCH7()   {STC32G_P1MODE_HIIN(PIN7); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x07;}   //selected ADC_CH7
#define  STC32G_ADCSELCH8()   {STC32G_P0MODE_HIIN(PIN0); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x08;}   //selected ADC_CH8
#define  STC32G_ADCSELCH9()   {STC32G_P0MODE_HIIN(PIN1); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x09;}   //selected ADC_CH9
#define  STC32G_ADCSELCH10()  {STC32G_P0MODE_HIIN(PIN2); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x10;}   //selected ADC_CH10
#define  STC32G_ADCSELCH11()  {STC32G_P0MODE_HIIN(PIN3); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x11;}   //selected ADC_CH11
#define  STC32G_ADCSELCH12()  {STC32G_P0MODE_HIIN(PIN4); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x12;}   //selected ADC_CH12
#define  STC32G_ADCSELCH13()  {STC32G_P0MODE_HIIN(PIN5); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x13;}   //selected ADC_CH13
#define  STC32G_ADCSELCH14()  {STC32G_P0MODE_HIIN(PIN6); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x14;}   //selected ADC_CH14
#define  STC32G_ADCSELCH15()  { ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x15;}  															 //selected  band gap voltage

#define STC32G_ADCRESLALIG()  {RESFMT = 0;} //adc result left alignment
#define STC32G_ADCRESRALIG()  {RESFMT = 1;} //adc result right alignment


//******************************************************
typedef enum
{
	ADC_CH0 =	0,  //ADC channel 0 at P10
	ADC_CH1,  		//ADC channel 1 at P11
	ADC_CH2,  		//ADC channel 2 at P54
	ADC_CH3,  		//ADC channel 3 at P13
	ADC_CH4,  		//ADC channel 4 at P14
	ADC_CH5,  		//ADC channel 5 at P15
	ADC_CH6,  		//ADC channel 6 at P16
	ADC_CH7,  		//ADC channel 7 at P17
	ADC_CH8,  		//ADC channel 8 at P00
	ADC_CH9,  		//ADC channel 9 at P01
	ADC_CH10,  		//ADC channel 10 at P02
	ADC_CH11,  		//ADC channel 11 at P03
	ADC_CH12,  		//ADC channel 12 at P04
	ADC_CH13,  		//ADC channel 13 at P05
	ADC_CH14,  		//ADC channel 14 at P06
	ADC_CH15,  		//ADC channel 15 at inner band gap voltage
}STC32G_ADC_CHN; //STC32G ADC channel

//******************************************************
typedef enum
{
	FOSC_DIV_2X1 = 0,  // FOSC / (2 * 1)
	FOSC_DIV_2X2,      // FOSC / (2 * 2)
	FOSC_DIV_2X3,      // FOSC / (2 * 3)
	FOSC_DIV_2X4,      // FOSC / (2 * 4)
	FOSC_DIV_2X5,      // FOSC / (2 * 5)
	FOSC_DIV_2X6,      // FOSC / (2 * 6)
	FOSC_DIV_2X7,      // FOSC / (2 * 7)
	FOSC_DIV_2X8,      // FOSC / (2 * 8)
	FOSC_DIV_2X9,      // FOSC / (2 * 9)
	FOSC_DIV_2X10,     // FOSC / (2 * 10)
	FOSC_DIV_2X11,     // FOSC / (2 * 11)
	FOSC_DIV_2X12,     // FOSC / (2 * 12)
	FOSC_DIV_2X13,     // FOSC / (2 * 13)
	FOSC_DIV_2X14,     // FOSC / (2 * 14)
	FOSC_DIV_2X15,     // FOSC / (2 * 15)
	FOSC_DIV_2X16,     // FOSC / (2 * 16)
}STC32G_ADC_SPEED; //STC32G ADC clock frequency

//******************************************************
typedef struct
{
	BOOL adcPowerOn;								//ADC power on enable/disable, 0-disable, 1-enable  
	STC32G_ADC_CHN adcChn;             //slected adc channel
	BOOL pwmTrigAble;
	STC32G_ADC_SPEED adcSpeed;			//STC32G_ADC_SPEED
	BOOL	adcResultRA;							//adc result_data style,0:left alignment(default), 1:right alignment
	BOOL	adcSetupTime;									//ADC channel select setup time control congigure, 0: 1 system clock cycles(default), 1: 2 system clock cycles
	u8	adcHoldTime;									//ADC channel select hold time control congigure.  0: 1 ADC clock cycle time, 1:2 ADC clock cycle times
	u8	adcSampleTime;								//analog signal sampling control time. 10 min. recommended 0x1F
	
}STC32G_ADC_TypeDef;

/******************************************************
Function: STC32G_AdcSelChn(STC32G_ADC_CHN chn);
return value: void
chn:adc channel
description: select adc channel
Example:
	STC32G_AdcSelChn(ADC_CH0);
******************************************************/
void STC32G_AdcSelChn(STC32G_ADC_CHN chn);

/******************************************************
Function: STC32G_AdcSelSpeed(STC32G_ADC_SPEED selSpeed);
return value: void
selSpeed:selected speed
description: configure adc speed
Example:
	STC32G_AdcSelSpeed(FOSC_DIV_2X16);
******************************************************/
void STC32G_AdcSelSpeed(STC32G_ADC_SPEED selSpeed);

/******************************************************
Function: STC32G_AdcInitDef(STC32G_ADC_TypeDef* pStruct);
return value: void
pStruct: STC32G_ADC_TypeDef struct address to be inited to default
description: Init STC32G_ADC_TypeDef struct to default value
Example:
	STC32G_ADC_TypeDef mStruct;
	STC32G_AdcInitDef(&mStruct);
******************************************************/
void STC32G_AdcInitDef(STC32G_ADC_TypeDef* pStruct);

/******************************************************
Function: STC32G_AdcInit(STC32G_ADC_TypeDef mStruct);
return value: void
mStruct: configure STC32G by mStruct
description: init adc
Example:
	STC32G_ADC_TypeDef mStruct;
	STC32G_AdcInit(mStruct);
******************************************************/
void STC32G_AdcInit(STC32G_ADC_TypeDef mStruct);

/******************************************************
Function: STC32G_AdcGetRes(ui16* pResult);	
return value: ui16
pResult: address to store got result
description: get adc result
Example:
	ui16 mReult;
	STC32G_AdcGetRes(&mReult);
******************************************************/
u16	 STC32G_AdcGetRes(ui16* pResult);	

#endif

源文件

/*STC32G_ADC.c
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu, 07/21/2022
*/

#include	"STC32G_ADC.h"


//******************************************************
void STC32G_AdcSelChn(STC32G_ADC_CHN chn)
{
	switch(chn)
	{
		case ADC_CH0:
			STC32G_ADCSELCH0()
			break;
		case ADC_CH1:
			STC32G_ADCSELCH1()
			break;
		case ADC_CH2:
			STC32G_ADCSELCH2()
			break;
		case ADC_CH3:
			STC32G_ADCSELCH3()
			break;
		case ADC_CH4:
			STC32G_ADCSELCH4()
			break;
		case ADC_CH5:
			STC32G_ADCSELCH5()
			break;
		case ADC_CH6:
			STC32G_ADCSELCH6()
			break;
		case ADC_CH7:
			STC32G_ADCSELCH7()
			break;
		case ADC_CH8:
			STC32G_ADCSELCH8()
			break;
		case ADC_CH9:
			STC32G_ADCSELCH9()
			break;
		case ADC_CH10:
			STC32G_ADCSELCH10()
			break;
		case ADC_CH11:
			STC32G_ADCSELCH11()
			break;
		case ADC_CH12:
			STC32G_ADCSELCH12()
			break;
		case ADC_CH13:
			STC32G_ADCSELCH13()
			break;
		case ADC_CH14:
			STC32G_ADCSELCH14()
			break;
		case ADC_CH15:
			STC32G_ADCSELCH15()
			break;
	}
}
//End of STC32G_AdcSelChn(STC32G_ADC_CHN chn)


//******************************************************
void STC32G_AdcSelSpeed(STC32G_ADC_SPEED selSpeed)
{
	ADCCFG &= 0xF0;
	ADCCFG |= selSpeed;
}
//End of STC32G_AdcSelSpeed(STC32G_ADC_SPEED selSpeed)


//******************************************************
void STC32G_AdcInitDef(STC32G_ADC_TypeDef* pStruct)
{
	pStruct -> adcPowerOn = 0;
	pStruct -> adcChn = ADC_CH0;
	pStruct -> pwmTrigAble = 0;         //PWM trigger disable
	pStruct -> adcSpeed = FOSC_DIV_2X1; //adc clk is sclok/2
	pStruct -> adcResultRA = 0;         //adc result left align
	pStruct -> adcSetupTime = 0;        //Tadcsetup a adc clk
	pStruct -> adcHoldTime = 0x01;      //adc hold time 2 adc clk
	pStruct -> adcSampleTime = 0x0A;    //adc sampling time: 11 adc clk, 0x0A <= adcSampleTime <= 0x1F 
}
//End of STC32G_AdcInitDef(STC32G_ADC_TypeDef* pStruct)

//******************************************************
void STC32G_AdcInit(STC32G_ADC_TypeDef mStruct)
{
	STC32G_AdcSelChn(mStruct.adcChn);

	ADC_EPWMT = mStruct.pwmTrigAble;
	
	ADCCFG &= 0xF0;
	ADCCFG |= mStruct.adcSpeed;
	
	RESFMT = mStruct.adcResultRA;
	
	ADCTIM &= 0x7F;
	ADCTIM |= mStruct.adcSetupTime;
	
	ADCTIM &= 0x9F;
	ADCTIM |= mStruct. adcHoldTime;
	
	ADCTIM &= 0xE0;
	ADCTIM |= mStruct. adcSampleTime;
	
	ADC_POWER = mStruct.adcPowerOn;
}
//End of STC32G_AdcInit(STC32G_ADC_TypeDef mStruct)

//******************************************************
u16	 STC32G_AdcGetRes(ui16* pResult)
{
	*pResult = 0;
	STC32G_ADCSTART();
	_nop_();
	_nop_();
	while(!ADC_FLAG);
	STC32G_ADCCLEARFLAG()
	*pResult = ADC_RES;
	if(RESFMT)
	{
		*pResult <<= 8;
		*pResult += ADC_RESL;
	}
	else
	{
		*pResult <<= 4;
		*pResult += ADC_RESL >> 4;
	}
	return 	*pResult;
}
//End of STC32G_AdcGetRes(ui16* pResult)

四 應(yīng)用編程示例

? ?下面寫段示例程序,演示ADC庫文件的使用。

? ? 頭文件:

/*main.h
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu ,04/18/2023
*/

#ifndef     __MAIN_H__
#define     __MAIN_H__

//#include "myport.h"
#include "mtype.h"
#include "config.h"
#include "STC32G_GPIO.h"
#include "STC32G_Delay.h"
#include "STC32G_UART.h"
//#include "STC32G_EEPROM.h"
//#include "STC32G_PWM.h"
#include "STC32G_ADC.h"
//#include "STC32G_EEPROM.H"
//#include "STC32G_SPI.h"
//#include "STC32G_PWM.h"
//#include "STC32G_Timer.h"
//#include "STC32G_comparator.h"

STC32G_ADC_TypeDef mstruct;

 
#endif

? 源文件:

/*main.c
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu, 03/25/2023
*/

#include "main.h"

ui8 str[30] = {0};
ui16 ADCRes = 0;
f32 TestVoltage = 0;



void main()
{
	SysInit();
	Uart1_Init(VBAUD_8BITS,G1, 0, 9600);
	
	
	STC32G_AdcInitDef(&mstruct);
	mstruct.adcPowerOn = 1;
	mstruct.adcChn = ADC_CH0;
	mstruct.pwmTrigAble = 0;
	mstruct.adcSpeed = FOSC_DIV_2X16;
	mstruct.adcHoldTime = 0x01;
	mstruct.adcSampleTime = 0x1F;
	
	STC32G_AdcInit(mstruct);
	
	while(1)
	{	
		STC32G_AdcGetRes(&ADCRes);
		Uart1_SendString("ADCRes = ");
		LongToString(ADCRes,str);	
		Uart1_SendString(str);
		Uart1_SendString("\r\n"); 
		
		
		TestVoltage = 5000.0/4096*ADCRes;
		FloatString(TestVoltage,str,2);
		Uart1_SendString("TestVoltage = ");
		Uart1_SendString(str);
		Uart1_SendString("mV");
		Uart1_SendString("\r\n");
		
		/*
		STC32G_ADCSELCH15()
		
		STC32G_AdcGetRes(&ADCRes);
		Uart1_SendString("ADCRes = ");
		LongToString(ADCRes,str);	
		Uart1_SendString(str);
		Uart1_SendString("\r\n"); 
		
		
		TestVoltage = 5000.0/4096*ADCRes;
		FloatString(TestVoltage,str,2);
		Uart1_SendString("Inner Bandgap Voltage = ");
		Uart1_SendString(str);
		Uart1_SendString("mV");
		Uart1_SendString("\r\n");
		
		STC32G_ADCSELCH0()
		*/
		
		Uart1_SendString("This a ADC Test Program!");
		Uart1_SendString("\r\n");
		Uart1_SendString("\r\n");
		Uart1_SendString("\r\n");
	  
		Delayxms(1000);
	}
}
//End of main()

? ? 測試板的參考電壓為基準(zhǔn)電壓芯片AD586提供的5V電壓。下面用一個10K的電位器將5V電源電壓分壓,將分壓接到P1.0做AD輸入,用ADC來測試分得電壓的大小。

測得基準(zhǔn)電壓值:

STC32G單片機內(nèi)置ADC及應(yīng)用編程

測得分壓值:

?STC32G單片機內(nèi)置ADC及應(yīng)用編程

將程序編譯,下載到單片機,在串口助手上看到的結(jié)果如下:

STC32G單片機內(nèi)置ADC及應(yīng)用編程

將源文件中的注釋去掉,再獲取內(nèi)部Bandgap的ADC值,并將其轉(zhuǎn)換為電壓,結(jié)果如下:

STC32G單片機內(nèi)置ADC及應(yīng)用編程

從結(jié)果可以看出,獲得的Bandgap電壓并不是手冊上所說的1.19V,至于為什么,不是此處討論的范圍。本例已完整演示了,如何調(diào)用ADC庫函數(shù),實現(xiàn)ADC值獲取及如何用ADC測量電壓。

相關(guān)庫函數(shù)及示例源代碼下載鏈接:

https://download.csdn.net/download/billliu66/87701680文章來源地址http://www.zghlxwxcb.cn/news/detail-487818.html

到了這里,關(guān)于STC32G單片機內(nèi)置ADC及應(yīng)用編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包