当前位置:AIGC资讯 > 数据采集 > 正文

stm32 使用ADC_DMA采集电压,并在显示屏上输出波形

红叶何时落水

DMA初始化

    GPIO_InitTypeDef GPIO_InitStructure;
	DMA_InitTypeDef DMA_InitStructure;//结构体定义
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//开启DMA时钟
 
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;		 
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
	GPIO_Init(GPIOA,&GPIO_InitStructure);//引脚设置为模拟输入


	DMA_DeInit(DMA1_Channel1);
	DMA_InitStructure.DMA_PeripheralBaseAddr = ((u32)0x4001244C);//ADC外设地址
	DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_arr; //采集到的数据要存入的内存地址
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; 
	DMA_InitStructure.DMA_BufferSize = 100; //ADC_arr的大小
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址的读取不改变
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增
	DMA_InitStructure.DMA_PeripheralDataSize = 
	DMA_PeripheralDataSize_HalfWord ; //外设地址读取数据的大小
	DMA_InitStructure.DMA_MemoryDataSize = 
	DMA_MemoryDataSize_HalfWord ;    //传入内存地址的大小(字节)
	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //是否开启循环传输
	DMA_InitStructure.DMA_Priority = DMA_Priority_High ; //DMA优先级设置
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;   //传输通道的方向
	
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);  //初始化
	DMA_Cmd(DMA1_Channel1,ENABLE);//使能

ADC初始化


	ADC_InitTypeDef ADC_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启时钟	

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC独立工作模式
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;  //是否使用多通道
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//是否连续采集数据
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //使用软件触发ADC
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //采集到的数据右对齐
	ADC_InitStructure.ADC_NbrOfChannel = 1; //一共使用一个通道
	ADC_Init(ADC1, &ADC_InitStructure);//初始化
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div8);//
	ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);//采样周期
	
	ADC_DMACmd(ADC1,ENABLE);//开启DMA传输
	ADC_Cmd(ADC1,ENABLE);//使能
 
	ADC_ResetCalibration(ADC1);//初始值校准
	while(ADC_GetResetCalibrationStatus(ADC1));//
 
	ADC_StartCalibration(ADC1);//
	while(ADC_GetCalibrationStatus(ADC1));//
 
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发

画线函数

void draw(u16 arr[], int len, int height)
{
	len = len - 1;
	LCD_Fill(0, 0, 240, 100, GREEN);
	for(i = 0; i < len; i++) {

		LCD_DrawLine(i * 230 / len, 100 - (arr[i] / height), (i + 1) * 230 / len, 100 -  (arr[i + 1] / height));
	}
}

主函数 

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    uart_init(9600);
	delay_init();	
	KEY_Init();
	LCD_Init();
    adc_init();
    POINT_COLOR=BLUE;   
    LCD_DrawLine(0, 100, 230, 100);

	while(1)
	{

		t=KEY_Scan(0);		
		switch(t)
		{				 
			case KEY0_PRES:
				draw(ADC_arr, 100, 40);
				adc_init();
				break;
			default:
				delay_ms(1);
		} 
		
	}
}

代码链接:ADC_DMA实现波形采集-单片机文档类资源-CSDN文库

更多资源如果需要,请到微信小程序“非遗种草社”留言。

更新时间 2023-11-08