ADC124S051驱动代码编写-HAL库-USB虚拟串口发送

 1、HAL库方式写的代码;USB虚拟串口发送;
2、USB虚拟串口发送方式在串口助手上没法显示十进制数据,我就专门写了一个显示十进制的助手,我自己用,不嫌弃的话就联系我要。我的还可以是实时显示数据波形哦。

3、数据发送给串口部分的代码没贴,只贴了核心的单通道和4通道 数据读取代码;

//定义通道选择
#define CH1		0B00000000
#define CH2		0B00001000
#define CH3		0B00010000
#define CH4		0B00011000

//读单个通道 函数返回ADC读到的数据;
//操作时序是:SCLK上升沿写入ADC寄存器,下降沿读取adc数据。
//可这样调用这个函数: ADC_read_signal_channel(CH1);这样就是读取通道1的数据
uint32_t ADC_read_signal_channel(uint8_t channel)
{
	uint8_t i = 0;
	uint32_t ADC_DATA = 0;
	
	HAL_GPIO_WritePin(GPIOB, SCLK, 0);
	HAL_GPIO_WritePin(GPIOA, CS3, 0);
	delay_us(1);
//------------------------------
	for (int i = 0; i < 16; i++)
	{
		HAL_GPIO_WritePin(GPIOB, DATAOUT, (channel & 0x80) >> 7);	//写入ADC control register
		channel = channel << 1;
		HAL_GPIO_WritePin(GPIOB, SCLK, 1);
		delay_us(1);
		
		if((i >= 4) && (i <= 15))	//从SCLK的第5个sclk开始读数据
		{
			if (HAL_GPIO_ReadPin(GPIOB, DATAIN))	//如果读到的状态是1
				ADC_DATA |= (1 << (15-i));
		}
		HAL_GPIO_WritePin(GPIOB, SCLK, 0);
		delay_us(1);
		
	}
//-----------------------------------
	HAL_GPIO_WritePin(GPIOA, CS3, 1);
	return ADC_DATA;
}


//这个函数是在64个SCLK读完4个通道的数据,函数返回数组的地址;
//这个ADC是在第5个SCLK开始读取ADC转换的数据,在16个SCLK之内完成一个通道的读取;
//每个通道的读取都要先向ADC寄存器写入要读取哪个通道;
//前8个SCLK写入ADC寄存器选择的通道,后8个SCLK向ADC寄存器写什么都行,不影响结果。
uint32_t *ADC_read_multiple_channel()
{
	
	static uint32_t value_array[NUMBER_OF_CHANNEL] = { 0 };
	
	uint8_t i = 0,j=0;
	uint8_t channel1 = 0B00000000;
	uint8_t channel2 = 0B00001000;
	uint8_t channel3 = 0B00010000;
	uint8_t channel4 = 0B00011000;
	
	uint32_t data1 = 0;
	uint32_t data2 = 0;
	uint32_t data3 = 0;
	uint32_t data4 = 0;
	
	HAL_GPIO_WritePin(GPIOB, SCLK, 0);
	HAL_GPIO_WritePin(GPIOA, CS3, 0);
	delay_us(1);
	
	for (j = 0; j < 4; j++)
	{
		switch (j)
		{
		case 0:
			for (int i = 0; i < 16; i++)
			{
				HAL_GPIO_WritePin(GPIOB, DATAOUT, (channel1 & 0x80) >> 7);  	//写入ADC control register
				channel1 = channel1 << 1;
				HAL_GPIO_WritePin(GPIOB, SCLK, 1);
				delay_us(1);
		
				if ((i >= 4) && (i <= 15))	//从SCLK的第5个sclk开始读数据
					{
						if (HAL_GPIO_ReadPin(GPIOB, DATAIN))	//如果读到的状态是1
							data1 |= (1 << (15 - i));
					}
				HAL_GPIO_WritePin(GPIOB, SCLK, 0);
				delay_us(1);
			}
			break;
		case 1:
			for (int i = 0; i < 16; i++)
			{
				HAL_GPIO_WritePin(GPIOB, DATAOUT, (channel2 & 0x80) >> 7);   	//写入ADC control register
				channel2 = channel2 << 1;
				HAL_GPIO_WritePin(GPIOB, SCLK, 1);
				delay_us(1);
		
				if ((i >= 4) && (i <= 15))	//从SCLK的第5个sclk开始读数据
					{
						if (HAL_GPIO_ReadPin(GPIOB, DATAIN))	//如果读到的状态是1
							data2 |= (1 << (15 - i));
					}
				HAL_GPIO_WritePin(GPIOB, SCLK, 0);
				delay_us(1);
			}
			break;
		case 2:
			for (int i = 0; i < 16; i++)
			{
				HAL_GPIO_WritePin(GPIOB, DATAOUT, (channel3 & 0x80) >> 7);    	//写入ADC control register
				channel3 = channel3 << 1;
				HAL_GPIO_WritePin(GPIOB, SCLK, 1);
				delay_us(1);
		
				if ((i >= 4) && (i <= 15))	//从SCLK的第5个sclk开始读数据
					{
						if (HAL_GPIO_ReadPin(GPIOB, DATAIN))	//如果读到的状态是1
							data3 |= (1 << (15 - i));
					}
				HAL_GPIO_WritePin(GPIOB, SCLK, 0);
				delay_us(1);
			}
			break;
		case 3:
			for (int i = 0; i < 16; i++)
			{
				HAL_GPIO_WritePin(GPIOB, DATAOUT, (channel4 & 0x80) >> 7);    	//写入ADC control register
				channel4 = channel4 << 1;
				HAL_GPIO_WritePin(GPIOB, SCLK, 1);
				delay_us(1);
		
				if ((i >= 4) && (i <= 15))	//从SCLK的第5个sclk开始读数据
					{
						if (HAL_GPIO_ReadPin(GPIOB, DATAIN))	//如果读到的状态是1
							data4 |= (1 << (15 - i));
					}
				HAL_GPIO_WritePin(GPIOB, SCLK, 0);
				delay_us(1);
			}
			break;
				
		default:
			break;
		}
	}
	HAL_GPIO_WritePin(GPIOA, CS3, 1);
	value_array[0] = data2;
	value_array[1] = data3;
	value_array[2] = data4;
	value_array[3] = data1;
	return value_array;
}

//在64个SCLK完成4通道读取时,实际读出来的数据顺序错开一个通道的,
//第1个16sclk读出来的数据其实是通道4的不是通道1,
//第2个16sclk读出来的数据其实是通道1的不是通道2,
//第3个16sclk读出来的数据其实是通道2的不是通道3,
//第4个16sclk读出来的数据其实是通道3的不是通道4.
发布了75 篇原创文章 · 获赞 98 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/aqwtyyh/article/details/100181943