用STM32F103获取ADS1220模数转换的值,以及C#做上位机的笔记

2 篇文章 0 订阅
1 篇文章 0 订阅

ADS1220

ADS1220是一款具有四通道的,24bit的模数转换器,其中两两可以组成差分输入,内部有可以编程的放大器,最大的放大倍数是128。

ADS1220的数据交换是通过SPI总线进行数据交换的,SPI工作在模式1。CPOL为0空闲时为低电平,CPHA为1,第二个边沿触发。

ADS的指令:
在这里插入图片描述
寄存器0:关于通道以及增益的配置在这里插入图片描述
寄存器1:关于转换速度的配置:
在这里插入图片描述
不同工作模式下的转换速度:
在这里插入图片描述
寄存器2:内部参考电压在这里插入图片描述
寄存器3:
在这里插入图片描述

STM32的配置

SPI的配置

static void ads_init(void)
{
	/*APB BUS INIT*/
	LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD);
	LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
	LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
	LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SPI1);
	/**SPI GPIO Configuration  
	PA5   ------> SPI1_SCK
	PA6   ------> SPI1_MISO
	PA7   ------> SPI1_MOSI
	PA4   ------> SPI1_NSS
	
	*/
	LL_GPIO_SetPinMode(GPIOA,LL_GPIO_PIN_4,LL_GPIO_MODE_OUTPUT);
	LL_GPIO_SetPinOutputType(GPIOA,LL_GPIO_PIN_4,LL_GPIO_OUTPUT_PUSHPULL);
	LL_GPIO_SetPinSpeed(GPIOA,LL_GPIO_PIN_4,LL_GPIO_SPEED_FREQ_HIGH);
	SPI1_DISENABLE;
	
	LL_GPIO_SetPinMode(GPIOA,LL_GPIO_PIN_5,LL_GPIO_MODE_ALTERNATE);
	LL_GPIO_SetPinOutputType(GPIOA,LL_GPIO_PIN_5,LL_GPIO_OUTPUT_PUSHPULL);
	LL_GPIO_SetPinSpeed(GPIOA,LL_GPIO_PIN_5,LL_GPIO_SPEED_FREQ_HIGH);
	
	LL_GPIO_SetPinMode(GPIOA,LL_GPIO_PIN_7,LL_GPIO_MODE_ALTERNATE);
	LL_GPIO_SetPinOutputType(GPIOA,LL_GPIO_PIN_7,LL_GPIO_OUTPUT_PUSHPULL);
	LL_GPIO_SetPinSpeed(GPIOA,LL_GPIO_PIN_7,LL_GPIO_SPEED_FREQ_HIGH);
	
	LL_GPIO_SetPinMode(GPIOA,LL_GPIO_PIN_6,LL_GPIO_MODE_FLOATING); //SPI1 GPIO INIT
}

SPI的数据收发

void ads_Reset()
{
	SPI1_ENABLE;
	uint32_t time_out = 0;	
	LL_SPI_TransmitData8( SPI1, ADS1220_RESET_CMD);
	while ((!LL_SPI_IsActiveFlag_TXE(SPI1))&&time_out<0xfffff)
	{
		time_out++;
	}
	time_out = 0;
	while ((!LL_SPI_IsActiveFlag_RXNE(SPI1))&&time_out<0xfffff)
	{
		time_out++;
	}
	(void)LL_SPI_ReceiveData8(SPI1);
	SPI1_DISENABLE;
}

void ads_Start()
{
	uint32_t time_out = 0;
	SPI1_ENABLE;
	LL_SPI_TransmitData8( SPI1, ADS1220_START_CMD);
	while ((!LL_SPI_IsActiveFlag_TXE(SPI1))&&time_out<0xfffff)
	{
		time_out++;
	}
	time_out = 0;
	while ((!LL_SPI_IsActiveFlag_RXNE(SPI1))&&time_out<0xfffff)
	{
		time_out++;
	}
	(void)LL_SPI_ReceiveData8(SPI1);
	SPI1_DISENABLE;;
}


void ads_SetREG(uint8_t *w_data,uint8_t data_size,uint8_t begin_addr)
{
	/*
	Note the value of the array,Prevent pointer overflow 
	bit3|bit2 is begin addr
	bit1|bit0 is number of data after the addr
	*/	
	uint32_t time_out = 0;
	if((begin_addr + data_size)>4)
	{
		return ;
	}
	else
		begin_addr = ADS1220_WREG_CMD|( begin_addr << 2 ) + data_size -1;
	

	SPI1_ENABLE;
	
	LL_SPI_TransmitData8(SPI1, begin_addr);
	while ((!LL_SPI_IsActiveFlag_TXE(SPI1))&&time_out<0xfffff)
	{
		time_out++;
	}
	time_out = 0;
	while ((!LL_SPI_IsActiveFlag_RXNE(SPI1))&&time_out<0xfffff)
	{
		time_out++;
	}
	(void)LL_SPI_ReceiveData8(SPI1);
	time_out = 0;
	
	for(uint8_t i = 0;i<data_size;i++)
	{
		LL_SPI_TransmitData8(SPI1, *w_data);
		while ((!LL_SPI_IsActiveFlag_TXE(SPIx))&&time_out<0xfffff)
		{
			time_out++;
		}
		time_out = 0;
		while ((!LL_SPI_IsActiveFlag_RXNE(SPI1))&&time_out<0xfffff)
		{
			time_out++;
		}
		(void)LL_SPI_ReceiveData8(SPI1);
		w_data ++;
	}
	SPI1_DISENABLE;
}
void ads_GetREG(uint8_t *r_data,uint8_t size, uint8_t begin_addr)
{
	/*
	Note the value of the array,Prevent pointer overflow 
	bit3|bit2 is begin addr
	bit1|bit0 is number of data after the addr
	*/
	uint32_t time_out = 0;
	if((begin_addr + size)>4)
	{
		return ;
	}
	else
		begin_addr = ADS1220_RREG_CMD|( begin_addr << 2 ) + size -1;
	
	SPI1_ENABLE;

	
	LL_SPI_TransmitData8(SPI1, begin_addr);
	while ((!LL_SPI_IsActiveFlag_TXE(SPI1))&&time_out<0xfffff)
	{
		time_out ++;
	}
	time_out = 0;
	while ((!LL_SPI_IsActiveFlag_RXNE(SPI1))&&time_out<0xfffff)
	{
	}
	(void)LL_SPI_ReceiveData8(SPI1);
	time_out = 0;
	for(uint8_t i = 0;i<size;i++)
	{
		LL_SPI_TransmitData8(SPI1,0x00);
		while ((!LL_SPI_IsActiveFlag_TXE(SPI1))&&time_out<0xfffff)
		{
			time_out ++;
		}
		time_out = 0;
		while ((!LL_SPI_IsActiveFlag_RXNE(SPI1))&&time_out<0xfffff)
		{
			time_out ++;
		}
		*r_data=LL_SPI_ReceiveData8(SPI1);
		r_data ++;
	}
	SPI1_DISENABLE;;
}

void ads_GetData(uint8_t *r_data)
{
	/*
	Note the value of the array,Prevent pointer overflow 
	bit3|bit2 is begin addr
	bit1|bit0 is number of data after the addr
	*/
	uint32_t time_out = 0;
	SPI1_ENABLE;
	
	LL_SPI_TransmitData8(SPI1, ADS1220_RDATA_CMD);
	while ((!LL_SPI_IsActiveFlag_TXE(SPI1))&&time_out<0xffff)
	{
		time_out++;
	}
	time_out = 0;
	while ((!LL_SPI_IsActiveFlag_RXNE(SPI1))&&time_out<0xffff)
	{
		time_out++;
	}
	(void)LL_SPI_ReceiveData8(SPI1);
	time_out = 0;
	for(uint8_t i = 0;i<3;i++)
	{
		LL_SPI_TransmitData8(SPI1,0xFF);
		while ((!LL_SPI_IsActiveFlag_TXE(SPI1))&&time_out<0xffff)
		{
			time_out++;
		}
		time_out = 0;
		while ((!LL_SPI_IsActiveFlag_RXNE(SPI1))&&time_out<0xffff)
		{
			time_out++;
		}
		*r_data=LL_SPI_ReceiveData8(SPI1);
		r_data ++;
	}
	SPI1_DISENABLE;
}

C#

1.将一组字符串转换为,二进制数组

        string s = "123456";
        var bt = Regex.Matches(s, @"[a-fA-F0-9]{2}").Cast<Match>().Select(t => (byte)Convert.ToInt32(t.Value, 16)).ToArray();//不是很懂不知道有人交流一下么

开一个线程

 	cbbBaudrates.SelectedIndex = 3;
    ThreadCapture = new Thread(MyStaticThreadCapture);
    ThreadCapture.Start();  // 只要使用Start方法,线程才会运行  
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103是一款52MHz主频的ARM Cortex-M3内核微控制器,具有丰富的外设资源和强大的计算能力。ADS1220是一款24位精度的低功耗、低噪音、Delta-Sigma模数转换器,适用于电压、电流和电阻的测量应用。 在STM32F103ADS1220的应用实例中,我们可以利用STM32F103的GPIO口和SPI接口与ADS1220进行通信。首先,我们需要配置STM32F103的GPIO口和SPI接口,并根据ADS1220的通信协议进行初始化设置。然后,我们可以通过SPI接口向ADS1220发送控制指令,例如启动转换、设置增益和采样速率等。同时,我们还可以通过SPI接口读取ADS1220转换后的数据。 在具体实例中,我们可以使用STM32F103的定时器和DMA功能实现自动定时采样,并将采样数据存储到内存中。通过ADS1220的24位精度和低噪音特性,我们可以获得高精度、低噪音的模拟信号测量结果。同时,可以利用STM32F103强大的计算能力对采样数据进行处理和分析,例如滤波、数据逻辑处理等。 除此之外,我们还可以结合其他外设资源,如LCD显示屏、按键、通信接口等,实现更加复杂的功能。例如,可以通过LCD显示屏实时显示ADS1220采样结果;通过按键实现启动和停止采样功能;通过通信接口(如UART或CAN总线)与外部设备进行数据交互和通信。 总之,STM32F103ADS1220的应用实例可以实现高精度、低噪音的模拟信号测量和处理。通过充分利用STM32F103的外设资源和计算能力,我们可以灵活地设计和实现各种应用场景,满足不同的测量需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值