收藏关注不迷路!!

🌟文末获取源码+数据库🌟

感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人


一、摘要

本设计以ADC转换为基础,采用ARMCortex-M3内核STM32F103ZET6作为主控芯片来控制,通过串行通信来传送和接收信号,并定时将数据保存到E2PROM中的数字电压测量监控系统,现已广泛地应用于雷达、通信、测控、图像、仪表、医疗、音频等领域,显示出强大的生命力和广阔的应用前景。

二、内容设计

整个系统将处理器Cortex三代产的嵌入式-微控制器的集成电路技术应用到主芯片上,同时准备相关的外设及电路,以此来做好相关数据的采集、显示及传输工作,整个过程包含了信号的调理、ADC、LCD及USART,还有特定的供电模块的对接。这个过程中,数模转换及USART技术中都应用了采用STM32片内的AD外设和USART外设。基于STM32的电压采集系统的系统结构图如图2.1所示。
在这里插入图片描述

图2.1 基于STM32的电压采集系统结构图
信号源产生的模拟电压信号,经过信号调理电路的处理,提高了测量信号的精度,并对信号进行隔离和滤波。将处理后的信号传送给ADC模块进行模数转换,然后发送至STM32微处理器,用LCD模块显示出来,同时通过USART通信接口传送至上位机。

系统原理

逐次逼近型ADC工作原理为:在电路1上出现首个时钟脉冲时,对电路进行控制,令位置最高的定时发生器为1,而此外的定时发生器都为0.然后经有数据寄存器,在数模转换器中输入。接着比较输入、输出电压,此处输出电压用表示,输入电压用v1表示,若是输入电压不低于输出电压,那么比较器的输出值则是1,反之,若是前者低于后者,那么输出值则是0.在数据寄存器上储存进行比较后获得的结果,其具体储存位置在这一寄存器的位上。当出现下一个CP时,在移位寄存器中,位置从高到低分别为1、0,若是其最高位置对1进行了保存,此时就有。此时需要将两类值进行对比,这两类值首先是;其次是v1。若是前者的值不超过后者,那么,反之,。若是其最高位置对0进行了保存,此时就有。此时需要将两类值进行对比,这两类值首先是;其次是VO’。若是前者的值不超过后者,那么,反之,,继续根据这一方式来进行对比,从而得到所需要的输出数字量。

三、程序设计

通用初始化代码
#include "IO.h"
u16 LED_MODE = 0XFFFF;
u8 B1_ALA_Flag = 1; 
u8 B2_Set_Flag = 0; 
u8 ALA_hour = 0,ALA_min = 0,ALA_sec = 0;
u8 B3_Select_Flag = 0;
 
void USART2_Init(u32 bound)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
 
	USART_InitStructure.USART_BaudRate = bound;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_Init(USART2, &USART_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_Cmd(USART2, ENABLE);
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
		
}
 
void USART2_SendString(u8 *str)
{
	u8 index = 0;
	do
	{
		USART_SendData(USART2, str[index]);
		while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == 0);
		index++;
	}while(str[index] != 0);
}
 
void RTC_Init(u8 HH,u8 MM,u8 SS)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE);
	
	NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
 
	PWR_BackupAccessCmd(ENABLE);
	BKP_DeInit();
 
	RCC_LSICmd(ENABLE);
	while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == 0);
 
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
	RCC_RTCCLKCmd(ENABLE);
	
	RTC_WaitForSynchro();
	RTC_WaitForLastTask();
 
	RTC_ITConfig(RTC_IT_SEC,ENABLE);
	RTC_WaitForLastTask();
 
	RTC_SetPrescaler(40000 - 1);
	RTC_WaitForLastTask();
 
	RTC_SetCounter(HH * 3600 + MM * 60 + SS);
	RTC_WaitForLastTask();
}
 
 
void ADC1_Init(void)
{
	ADC_InitTypeDef ADC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_ADC1, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
 
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
 
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_DataAlign= ADC_DataAlign_Right;
	ADC_InitStructure.ADC_NbrOfChannel = 1;
	ADC_Init(ADC1, &ADC_InitStructure);
	ADC_Cmd(ADC1, ENABLE);
	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1));
 
	ADC_StartCalibration(ADC1);
	while(ADC_GetCalibrationStatus(ADC1));
		
		
}
 
u16 Get_Adc(void)
{
	ADC_RegularChannelConfig( ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);
 
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
	while(ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC) == 0);
		
	return ADC_GetConversionValue(ADC1);
}
 
void _24c02_Write(u8 address,u8 dat)
{
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(address);
	I2CWaitAck();
	I2CSendByte(dat);
	I2CWaitAck();
	I2CStop();
}
 
u8 _24c02_Read(u8 address)
{
	u8 dat;
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(address);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0xa1);
	I2CWaitAck();
	dat = I2CReceiveByte();
	I2CWaitAck();
	I2CStop();
	return dat;
}
 
void LED_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	GPIO_InitStructure.GPIO_Pin = 0xff00;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_Init(GPIOD, &GPIO_InitStructure);
 
	GPIOC->ODR  = LED_MODE;
	GPIOD->ODR |= (1<<2);
	GPIOD->ODR &=~(1<<2);
}
 
 
void KEY_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

资料获取

文章下方名片联系我即可~

博主联系方式:点击我获取资料->->进我个人主页–>获取博主联系方式

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐