STM32 DAC和ADC的使用

 一、系统架构

本次实验主要的功能就是在F103开发板上,DAC通道1输出值,然后外接杜邦线值ADC的通道1上面去,通过打印到串口出去,看采样的电压值是否相等

注意点: 必须将杜邦线接收PA1和PA4,让PA4通道产生的模拟电压值能够被PA1捕获到,不然你代码写出玫瑰花来也没用。 

 二、原理讲解

网上关于输出寄存器或者是模式有很多种,官方手册给的也很详细很复杂

而在学习阶段我们也不会使用那么复杂的模型  所以我们这里一切从简,ADC和DAC都采用最简单的模式

但是无论是什么模式我们需要很明确的概念就是 

ADC:将模拟量转化成为数字量

DAC:向数字量转化成为模拟量

模拟量和数字量具体的含义比较难以理解,我们可以简单的理解模拟量就是我们的电压值,

数字量就是存放在寄存器中的值,二者有对应的关系 

三。环境配置 

 环境我是用cubex生成的 

串口1使能,方便打印数据

ADC1 的通道1   查手册可以知道复用了PA4y引脚

DAC1 的通道1   查手册复用PA1

外接杜邦线才能将起作用,因为芯片内部是不相连  必须外接导线才可以将电压值导通      

 四、代码

 这里我只列写出关键性主要的代码  通过串口打印 输出比较两个值

   	u16 adcx;
	u16 dacval=0;


while(1)
	{
	 
			dacval+=200;
            HAL_DAC_SetValue(&DAC1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,dacval);//设置DAC值
			printf("\r\n为DAC通道1设置 : %d\r\n",dacval);
		
            adcx=Get_Adc_Average(ADC_CHANNEL_1,20);//读取前面设置DAC的值
			
			printf("\r\n从DAC通道1读取到的值是 : %d\r\n",adcx);
		
	      HAL_Delay(1000);
		
		
	}	  

 五、实验结果

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用STM32DAC模块来输出一个波形,然后使用ADC模块来采集这个波形。下面是一个简单的例子,展示了如何使用STM32Cube HAL库来实现这个功能。 首先,你需要配置DACADC的引脚和模式。例如,你可以选择一个DAC通道输出一个三角波形,然后将该通道连接到ADC输入引脚。 接下来,你需要初始化DACADC模块。在初始化DAC时,你可以设置输出波形的幅值和频率。在初始化ADC时,你需要配置输入通道和采样率等参数。 然后,在主循环中,你可以使用DAC模块来生成波形,并同时使用ADC模块来采集该波形。 以下是一个简单的示例代码,展示了如何实现这个功能: ```c #include "stm32f4xx_hal.h" DAC_HandleTypeDef hdac; ADC_HandleTypeDef hadc; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_DAC_Init(void); static void MX_ADC1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DAC_Init(); MX_ADC1_Init(); HAL_DAC_Start(&hdac, DAC_CHANNEL_1); HAL_ADC_Start(&hadc); while (1) { for (uint16_t i = 0; i < 4096; i++) { HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, i); HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY); uint16_t adcValue = HAL_ADC_GetValue(&hadc); // 在这里可以处理采集到的ADC值 } } } void SystemClock_Config(void) { // 系统时钟配置 } static void MX_GPIO_Init(void) { // GPIO初始化配置 } static void MX_DAC_Init(void) { hdac.Instance = DAC; HAL_DAC_Init(&hdac); DAC_ChannelConfTypeDef sConfig = {0}; sConfig.DAC_Trigger = DAC_TRIGGER_NONE; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1); } static void MX_ADC1_Init(void) { hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.ScanConvMode = DISABLE; hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.NbrOfConversion = 1; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; HAL_ADC_Init(&hadc); ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_0; // 根据实际情况选择ADC通道 sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; HAL_ADC_ConfigChannel(&hadc, &sConfig); } ``` 请记得根据你的具体硬件配置和需求进行适当的修改。希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值