用正点原子的板子(STM32F4探索者)做DAC 实验
创始人
2025-06-01 08:24:10
0

1. 实验目的

使用STM32F4内部 DAC1来输出电压,通过 ADC1的通道5采集DAC的输出电压,并通过串口打印电压值。

2. 实验准备和流程

在这里插入图片描述
这里使用DAC的通道1,其对应的引脚是PA4。
在这里插入图片描述
注意这里的PA4引脚配置的是模拟输入,但是 STM32F4 内部会连接在 DAC模拟输出上。
在这里插入图片描述
这里Vref+连接VDDA,是3.3v,根据计算公式,可以求出输出电压对应的数字量的值。

具体的流程如下:
初始化DAC;
初始化ADC;
编写DAC 输入值函数;
编写ADC转换中断函数;
编写main函数。

2.1 初始化DAC

在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/279f99b0bd1b41a6b15c7a12e3a6805c.png

DAC有三种触发模式:不使用触发、软件触发、外部触发。这里使用的是不使用触发。
触发是指将数据寄存器DORx中的数据转换成模拟信号输出的信号。不使用触发模式,指的是在向DAC数据寄存器DHR写入数据之后,DAC转化模块自动转换一次;软件触发模式,指的是向软件触发寄存器SWTRIGR中写入命令时触发转换,也就是将DOR寄存器中的数据进行转换;外部触发模式,一般是定时器触发。

void  DAC_Config_Init(void){   //PA4引脚DAC_InitTypeDef  DAC_InitStruct;        //DAC结构体GPIO_InitTypeDef  GPIO_InitStruct;      //GPIO结构体RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);         //使能GPIOA时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);          //使能DAC时钟GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_4;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;                     //模拟输入 GPIO_InitStruct.GPIO_PuPd =  GPIO_PuPd_DOWN;                  //下拉GPIO_Init(GPIOA, &GPIO_InitStruct);DAC_InitStruct.DAC_Trigger =  DAC_Trigger_None;               //不使用触发功能DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_None;      //不使用波形发生DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;           //用来设置屏蔽/幅值选择器,没有使用波形发生器,这里不使用DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Disable;                      //不使用输出缓存DAC_Init(DAC_Channel_1, &DAC_InitStruct);                                        //初始化DAC		DAC_Cmd(DAC_Channel_1,ENABLE);                                                   //使能DAC通道1DAC_SetChannel1Data(DAC_Align_12b_R,0);                                         //12位右对齐数据格式设置DAC值,初始化设置为0
}

2.2 初始化ADC

//初始化GPIO         设置ADC1的通道5来进行AD转换的,是PA5引脚
static void ADCx_Config(void){GPIO_InitTypeDef GPIO_InitStructure;  //GPIO初始化结构体ADC_CommonInitTypeDef ADC_CommonInitStructure;  //初始化CCR寄存器结构体ADC_InitTypeDef ADC_InitStructure;  //初始化ADC1参数RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟//初始化结构体变量GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                //PA5通道5GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AN;            //模拟输入GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;        //不带上下拉GPIO_Init(GPIOA,&GPIO_InitStructure);RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);       //ADC1复位RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);      //复位结束 //初始化通用配置ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;  //独立模式ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;  //两个采样阶段之间的延迟5个时钟ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;       //DMA失能ADC_CommonInitStructure.ADC_Prescaler =  ADC_Prescaler_Div4;                  //预分频4分频。ADCCLK = PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36MhzADC_CommonInit(&ADC_CommonInitStructure);                                     //初始化//初始化ADC1相关参数ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;                         //12位模式ADC_InitStructure.ADC_ScanConvMode = DISABLE;                                  //非扫描模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;                            //开启连续转换 ()()()ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;    //禁止触发检测,使用软件触发ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                         //数据对齐方式:右对齐ADC_InitStructure.ADC_NbrOfConversion = 1;                                     //1个转换在规则序列中ADC_Init(ADC1, &ADC_InitStructure);                                            //ADC初始化ADC_Cmd(ADC1, ENABLE);//开启 AD 转换器ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);                                           //ADC转换结束产生中断,在中断服务程序中读取转换值,开启中断ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_480Cycles );	  //设置指定 ADC 的规则组通道,一个序列,采样时间ADC_SoftwareStartConv(ADC1);  //软件触发
}
static void ADC_NVIC_Config(void){//NVIC初始化结构体NVIC_InitTypeDef  NVIC_InitStruct;//设置中断优先级的分组//就是设置主抢占优先级和子抢占优先级各是几,这里是分组为1,代表主优先级可以是0和1(就是1个位来设置主优先级),子优先级是0-7,是2的3次方NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //配置ADC为中断源NVIC_InitStruct.NVIC_IRQChannel = ADC_IRQn;//配置抢占优先级NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//配置子优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//使能中断NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);
}
void ADC1_Init(void){ADCx_Config();ADC_NVIC_Config();
}

2.3 编写DAC输入值函数

该函数就是把想输出的电压值换算成对应DAC的输入值,这里value值就是期望的电压值,这里做了10倍处理。

 //vaule:0—33,对应的是0-3.3vvoid DAC_Set_Valur(uint16_t value){float temp = value;temp = value/10;temp = temp*4095/3.3;DAC_SetChannel1Data(DAC_Align_12b_R,temp);      }

2.4 编写ADC转换中断函数

uint16_t  ADC_Value = 0;
void ADC_IRQHandler(void){if(ADC_GetITStatus(ADC1, ADC_IT_EOC) == SET){                   //表示中断已经来了,EOC=1,代表数据转换结束ADC_Value = ADC_GetConversionValue(ADC1);                //获取ADC数据	}ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
}

2.5 编写main函数

float ADC_ConvertedValueLocal;   //存储转换的电压值
extern  uint16_t  ADC_Value;
int main(void)
{USART_Config();ADC1_Init();DAC_Config_Init();DAC_Set_Valur(10); //想要输出1v电压delay_init(168);while(1){delay_ms(500);ADC_ConvertedValueLocal = (float)ADC_Value/4096*3.3;printf("\r\n The current AD value = 0x%04X \r\n",ADC_Value);printf("\r\n The current AD value = %.4fV \r\n",ADC_ConvertedValueLocal);printf("\r\n\r\n");delay_ms(500);}
}

3. 实验结果

使用跳线帽把DAC和ADC的引脚连起来,这里把想输出的电压值设置为1v,2v,3v,观察串口输出的结果。

DAC_Set_Valur(10); //想要输出1v电压  
DAC_Set_Valur(20); //想要输出2v电压  
DAC_Set_Valur(30); //想要输出3v电压  

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关内容

热门资讯

越来越热闹的大湾区车展:鸿蒙智... 车展首日恰逢端午节第一天,展馆内各大汽车品牌的销售人员高举促销牌来回穿梭,看展的观众人数达到了18....
那些我再也不做的事歌词是怎样的 那些我再也不做的事歌词是怎样的 那些我再也不做的事 演唱:吴克群 我们说好分手不必检讨我们说好记住...
<<金甲虫>... <<金甲虫>>中的有趣的密码 英文中以单词the出现的次数最多。可以根据这个原理察看是否有重复多次的...
中央军委原副主席许其亮逝世 新华社北京6月2日电 中国共产党的优秀党员,久经考验的忠诚的共产主义战士,无产阶级军事家,中国人民解...
ST香雪借贷纠纷:被判需偿还超... 6月2日,ST香雪(维权)(300147)发布公告,近日公司与湖北青松逾越医药有限公司的借贷纠纷案件...
18岁女孩打美容针后全身过敏住... 转自:荔枝新闻 【#18岁女孩打美容针后全身过敏住进IC...
上海端午假期全要素旅游消费金额... 观点网讯:6月2日,上海端午假日文旅市场成绩显著。全要素旅游消费金额达124.77亿元,同比增长3....
候都有哪些成语 候都有哪些成语伺间候隙、 鸡鸣候旦、 伫候佳音、 承颜候色、 恭候台积薪候燎
新股前瞻|盈利拐点遥遥无期,驭...   自动驾驶行业上市潮仍在继续。据披露,一家自动驾驶公司驭势科技(北京)股份有限公司(简称“驭势科技...
董事会主席钱雪明增持创胜集团(... 香港联交所最新资料显示,5月27日,董事会主席钱雪明增持创胜集团(06628)2万股,每股作价1.3...
我可以划船不用浆,我可以扬帆没... 我可以划船不用浆,我可以扬帆没有风向,因为我这一生,全靠浪! 我我可以划船不用浆,我可以扬帆没有风向...
昆仑决每周几直播 几点 什么卫... 昆仑决每周几直播 几点 什么卫视江苏卫视每周六下午3:00
职场人想强大自己如何立志? 职场人想强大自己如何立志?职场人做强做大自己。就要励志。,树立远大的理想和目标。明白目标和理想的实现...
三国平阳是哪里 三国平阳是哪里平阳郡是三国时期魏国设立的,在今天的山西临汾一带
男孩做亲子鉴定后被遗弃幼儿园,... 男孩做亲子鉴定后被遗弃幼儿园,现在人的婚姻到底怎么了?男子跟自己的儿子做完亲子鉴定之后,就将孩子遗弃...
游戏王卡组,,,虽然已经过时,... 游戏王卡组,,,虽然已经过时,谁帮我组一下,要有黑魔导和黑魔导女孩,卡牌40张说实话游戏是很菜的他能...
【魔兽世界】里的 [便携黑洞]... 【魔兽世界】里的 [便携黑洞] 24格包包在哪里买?有声望要求没有?沙塔斯天涯旅店,有个女招待哈莉丝...
合肥市创业免息政策,合肥创业补... 持卡人信用卡逾期后,大部分持卡人将面临高额罚息和银行催收。在巨大的还款压力和频繁的催收中,很多持卡人...
CITIC Securitie... 香港联交所最新资料显示,5月27日,CITIC Securities Company Limited...
红楼梦中鸳鸯是谁的丫鬟 红楼梦中鸳鸯是谁的丫鬟《红楼梦》中鸳鸯是贾母的丫鬟。一、鸳鸯的身份和地位在《红楼梦》中,鸳鸯是贾母的...