f28027 ADC代码

在主函数的声名

// ADC配置函数
void ADC_SOC_CNF(int ChSel[], int Trigsel[], int ACQPS[], int IntChSel, int mode);

在这里插入图片描述

在主函数的使用

	// Configure ADC
	ADC_SOC_CNF(ChSel,TrigSel,ACQPS, 16, 0);	// Mode= Start/Stop (0)

底层:

#include "PeripheralHeaderIncludes.h"

void ADC_SOC_CNF(int ChSel[], int Trigsel[], int ACQPS[], int IntChSel, int mode)
{

	extern void DSP28x_usDelay(Uint32 Count);

 
	EALLOW;
	AdcRegs.ADCCTL1.bit.ADCREFSEL	= 0;    //内部/外部参考选择,  0:内部能带隙用于参考源的产生
   	AdcRegs.ADCCTL1.bit.ADCBGPWD	= 1;	// Power up band gap   内核内的能带隙缓冲电路上电
   	AdcRegs.ADCCTL1.bit.ADCREFPWD	= 1;	// Power up reference   内核内的参考缓冲电路断电
   	AdcRegs.ADCCTL1.bit.ADCPWDN 	= 1;	// Power up rest of ADC
	AdcRegs.ADCCTL1.bit.ADCENABLE	= 1;	// Enable ADC

	DSP28x_usDelay(1000);         // Delay before converting ADC channels

	AdcRegs.ADCCTL1.bit.INTPULSEPOS	= 1;    //中断脉冲在ADC结果锁存到结果寄存器的前一个周期产生

	AdcRegs.ADCSOC0CTL.bit.ACQPS = ACQPS[0];   //控制SOCx的采样和保持窗口。最小允许值为6。  ,, 8,,采样窗口为9个周期的长度
   	AdcRegs.ADCSOC1CTL.bit.ACQPS = ACQPS[1];
   	AdcRegs.ADCSOC2CTL.bit.ACQPS = ACQPS[2];
   	AdcRegs.ADCSOC3CTL.bit.ACQPS = ACQPS[3];
   	AdcRegs.ADCSOC4CTL.bit.ACQPS = ACQPS[4];
   	AdcRegs.ADCSOC5CTL.bit.ACQPS = ACQPS[5];
   	AdcRegs.ADCSOC6CTL.bit.ACQPS = ACQPS[6];
   	AdcRegs.ADCSOC7CTL.bit.ACQPS = ACQPS[7];
   	AdcRegs.ADCSOC8CTL.bit.ACQPS = ACQPS[8];
   	AdcRegs.ADCSOC9CTL.bit.ACQPS = ACQPS[9];
   	AdcRegs.ADCSOC10CTL.bit.ACQPS = ACQPS[10];
   	AdcRegs.ADCSOC11CTL.bit.ACQPS = ACQPS[11];
   	AdcRegs.ADCSOC12CTL.bit.ACQPS = ACQPS[12];
   	AdcRegs.ADCSOC13CTL.bit.ACQPS = ACQPS[13];
   	AdcRegs.ADCSOC14CTL.bit.ACQPS = ACQPS[14];
   	AdcRegs.ADCSOC15CTL.bit.ACQPS = ACQPS[15];

	AdcRegs.INTSEL1N2.bit.INT1SEL = IntChSel;		// IntChSel=16,  IntChSel causes ADCInterrupt 1   ,ADCINTx EOC源选择 ,16,无效值
	                                                // INTSEL1N2,,中断选择1和2寄存器(INTSEL1N2)(地址偏移量08h)

	if (mode == 0)		// Start-Stop conv mode    模式选择,
	{
		AdcRegs.ADCINTFLG.bit.ADCINT1 = 0;  // clear interrupt flag for ADCINT1
		AdcRegs.INTSEL1N2.bit.INT1CONT = 0;	// clear ADCINT1 flag to begin a new set of conversions
		                                    //0:在ADCINTx标志(ADCINTFLG寄存器)被用户清除前,没有另外的 ADCINTx边沿产生。
	   	AdcRegs.ADCINTSOCSEL1.all=0x0000;	// No ADCInterrupt will trigger SOCx,,没有ADCINT能触发SOCx。TRIGSEL字段决定了SOCx的触发源
	   	AdcRegs.ADCINTSOCSEL2.all=0x0000;
	}
	if (mode == 1)		// Continuous conv mode
	{
		AdcRegs.INTSEL1N2.bit.INT1CONT = 1;	// set ADCInterrupt 1 to auto clr   1:无论EOC边沿何时产生都将产生ADCINTx边沿(不考虑标志位是否清零)
		AdcRegs.ADCINTSOCSEL1.all=0xFF;// ADCInterrupt 1 will trigger SOCx, TrigSel is ignored
		AdcRegs.ADCINTSOCSEL2.all=0xFF;
	}

	if (mode == 2)		// CLA mode, Start Stop ADC with auto clr ADC Flag
	{
		AdcRegs.ADCINTFLG.bit.ADCINT1 = 0;  // clear interrupt flag for ADCINT1
		AdcRegs.INTSEL1N2.bit.INT1CONT = 1;	// set ADCInterrupt 1 to auto clr
		AdcRegs.ADCINTSOCSEL1.all=0x0000;	// No ADCInterrupt will trigger SOCx
	   	AdcRegs.ADCINTSOCSEL2.all=0x0000;
	}

	if(IntChSel<15)
		AdcRegs.INTSEL1N2.bit.INT1E = 1;		// enable ADC interrupt 1
	else
		AdcRegs.INTSEL1N2.bit.INT1E = 0;		// disable the ADC interrupt 1

// Select the channel to be converted when SOCx is received
	AdcRegs.ADCSOC0CTL.bit.CHSEL= ChSel[0];   //选择被转换的通道。
	AdcRegs.ADCSOC1CTL.bit.CHSEL= ChSel[1];
	AdcRegs.ADCSOC2CTL.bit.CHSEL= ChSel[2];
	AdcRegs.ADCSOC3CTL.bit.CHSEL= ChSel[3];
	AdcRegs.ADCSOC4CTL.bit.CHSEL= ChSel[4];
	AdcRegs.ADCSOC5CTL.bit.CHSEL= ChSel[5];
	AdcRegs.ADCSOC6CTL.bit.CHSEL= ChSel[6];
	AdcRegs.ADCSOC7CTL.bit.CHSEL= ChSel[7];
	AdcRegs.ADCSOC8CTL.bit.CHSEL= ChSel[8];
	AdcRegs.ADCSOC9CTL.bit.CHSEL= ChSel[9];
	AdcRegs.ADCSOC10CTL.bit.CHSEL= ChSel[10];
	AdcRegs.ADCSOC11CTL.bit.CHSEL= ChSel[11];
	AdcRegs.ADCSOC12CTL.bit.CHSEL= ChSel[12];
	AdcRegs.ADCSOC13CTL.bit.CHSEL= ChSel[13];
	AdcRegs.ADCSOC14CTL.bit.CHSEL= ChSel[14];
	AdcRegs.ADCSOC15CTL.bit.CHSEL= ChSel[15];


	AdcRegs.ADCSOC0CTL.bit.TRIGSEL= Trigsel[0];  //SOCx触发源选择   ,sampling triggered by EPWM1 SOCA
	AdcRegs.ADCSOC1CTL.bit.TRIGSEL= Trigsel[1];
	AdcRegs.ADCSOC2CTL.bit.TRIGSEL= Trigsel[2];
	AdcRegs.ADCSOC3CTL.bit.TRIGSEL= Trigsel[3];
	AdcRegs.ADCSOC4CTL.bit.TRIGSEL= Trigsel[4];
	AdcRegs.ADCSOC5CTL.bit.TRIGSEL= Trigsel[5];
	AdcRegs.ADCSOC6CTL.bit.TRIGSEL= Trigsel[6];
	AdcRegs.ADCSOC7CTL.bit.TRIGSEL= Trigsel[7];
	AdcRegs.ADCSOC8CTL.bit.TRIGSEL= Trigsel[8];
	AdcRegs.ADCSOC9CTL.bit.TRIGSEL= Trigsel[9];
	AdcRegs.ADCSOC10CTL.bit.TRIGSEL= Trigsel[10];
	AdcRegs.ADCSOC11CTL.bit.TRIGSEL= Trigsel[11];
	AdcRegs.ADCSOC12CTL.bit.TRIGSEL= Trigsel[12];
	AdcRegs.ADCSOC13CTL.bit.TRIGSEL= Trigsel[13];
	AdcRegs.ADCSOC14CTL.bit.TRIGSEL= Trigsel[14];
	AdcRegs.ADCSOC15CTL.bit.TRIGSEL= Trigsel[15];
	EDIS;

	AdcRegs.ADCSOCFRC1.all = 0xFFFF;		// kick-start ADC   1:清除SOCx溢出标志

}

STM32F030的ADC(Analog-to-Digital Converter)是一个模拟信号数字化转换器,用于采集微控制器输入的模拟电压数据。在编写代码时,通常涉及以下几个步骤: 1. **初始化 ADC**: 首先需要配置ADC的工作模式、通道选择、时钟源等。例如,你可以使用`HAL_ADC_Init()`函数初始化ADC模块。 ```c ADC_HandleTypeDef hadc1; hadc1.Instance = ADC1; // 假设你使用的ADC1实例 hadc1.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2; // 时钟预分频 hadc1.Init.ScanConvMode = DISABLE; // 单次转换模式 // ... 更多配置... HAL_ADC_Init(&hadc1); ``` 2. **配置通道**: 确定你想通过哪个通道采集数据,并设置相应的通道寄存器。 ```c ADC_CHANNELTypeDef sConfig = {ADC_CHANNEL_0}; // 选择通道0为例 HAL_ADC_ConfigChannel(&hadc1, &sConfig); ``` 3. **启动转换**: 启动ADC开始转换过程。 ```c HAL_ADC_Start(&hadc1); ``` 4. **等待转换完成**: 转换完成后,你需要等待并读取结果。这通常是异步操作,通过中断处理程序来完成。 5. **读取 ADC 数据**: 可以通过`HAL_ADC_GetConversionValue()`获取当前转换的结果。 ```c uint16_t data; while (!HAL_ADC_GetFlagStatus(&hadc1, ADC_FLAG_EOC)) {} // 等待转换结束标志 data = HAL_ADC_GetValue(&hadc1); // 获取12位转换值 ``` 6. **错误检查**: 别忘了检查是否有错误发生,如转换溢出或其他故障。 ```c if (HAL_ADC_GetState(&hadc1) != HAL_ADC_STATE_READY) { // 处理错误 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值