STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置
ADC工作均为非阻塞状态
轮询模式
中断模式
DMA模式
库函数:
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放在循环中不断开启 HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc); HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);//等待转换结束,只适用于轮询 HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventType, uint32_t Timeout);// HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);//中断模式 HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc); void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc);//中断 HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);//DMA模式 HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc); uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc); //读取ADC的值 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);//结束后回调 void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc);//转换过程中回调 void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc); void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc);
校准模式:
校准ADC(HAL_ADCEx_Calibration_Start(&hadc);有些芯片不支持校准,F4不支持
----------------------------------------------------------------------------------------------------------------------------------
可变占空比设置
/*
实际使用时空置引脚状态下会飘动,大致为3.3V的一半,是芯片内部的原因
解决方式:引脚设置为下拉输入,F4没有这个设置
*/
/* USER CODE BEGIN 2 */
// HAL_ADC_Start_IT(&hadc1);//开启ad转换
HAL_TIM_Base_Start_IT(&htim3);//定时器中断
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//开启输出pwm
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while ()
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
float pwmOut ;
float dutyRatio;
int lastTickMs=;
HAL_ADC_Start(&hadc1);
if(HAL_GetTick() - lastTickMs >= )
{
HAL_GPIO_TogglePin(RUNNING_LED_GPIO_Port,RUNNING_LED_Pin);
lastTickMs = HAL_GetTick();
}
HAL_Delay();
adcConvertedValue=HAL_ADC_GetValue(&hadc1);//获取AD转换值
adcConvertedVoltage =(double)adcConvertedValue*3.3/;
pwmOut = adcConvertedValue*/;
dutyRatio = pwmOut/ ;
TIM3->CCR2 = pwmOut; //(pwmOut)/ 2400 change Duty ratio
printf("AD转换原始值 = %d\r\n", adcConvertedValue);
printf("计算得出电压值 = %f V \r\n",adcConvertedVoltage);
printf("实际输出pwm值 = %f\r\n", pwmOut);
printf("占空比 = %f%%\r\n",dutyRatio*);
}
/* USER CODE END 3 */
}
手动更改占空比
TIM3->CCR2 改变占空比

TIM3->ARR 改变频率
TIM3->PSC
ADC_EXIT 触发引脚
32芯片自带的温度传感器,在16或者18通道
可以用来做对比

代码:
//对于12位的ADC,3.3V的ADC值为0xfff,温度为25度时对应的电压值为1.43V即0x6EE
#define V25 0x6EE
//斜率 每摄氏度4.3mV 对应每摄氏度0x05
#define AVG_SLOPE 0x05 /* 启动AD转换并使能DMA传输和中断 */
HAL_ADC_Start_DMA(&hadcx,(uint32_t *)&ADC_ConvertedValue,sizeof(ADC_ConvertedValue)); /* 无限循环 */
while ()
{
HAL_Delay();
Current_Temperature = (V25-ADC_ConvertedValue)/AVG_SLOPE+; //计算公式
/* 10进制显示 */
printf("The IC current temperature = %d->%3d ℃\n",ADC_ConvertedValue,Current_Temperature);
// /* 16进制显示 */
// printf("The current temperature= %04x \n", Current_Temperature);
}
应用:测量压敏电阻阻值---还是测电压
while ()
{
HAL_Delay();
/* 3.3为AD转换的参考电压值,stm32的AD转换为12bit,2^12=4096,
即当输入为3.3V时,AD转换结果为4096 */
ADC_ConvertedValueLocal =(float)ADC_ConvertedValue*3.3/;
flexiforce_R = 3.3*/ADC_ConvertedValueLocal; // V(out) = Rref * Vcc / R; Rref=20K Vcc=3.3V
printf("AD转换原始值 = 0x%04X \r\n", ADC_ConvertedValue);
printf("计算得出电压值 = %f V \r\n",ADC_ConvertedValueLocal);
printf("计算得出电阻值 = %f KR\n",flexiforce_R);
}
DMA多通道采集-----开启多通道设置,定义一个数组存放转换值
while ()
{
HAL_Delay();
/* 3.3为AD转换的参考电压值,stm32的AD转换为12bit,2^12=4096,
即当输入为3.3V时,AD转换结果为4096 */
ADC_ConvertedValueLocal[] =(float)(ADC_ConvertedValue[]&0xFFF)*3.3/; // ADC_ConvertedValue[0]只取最低12有效数据
ADC_ConvertedValueLocal[] =(float)(ADC_ConvertedValue[]&0xFFF)*3.3/; // ADC_ConvertedValue[1]只取最低12有效数据
ADC_ConvertedValueLocal[] =(float)(ADC_ConvertedValue[]&0xFFF)*3.3/; // ADC_ConvertedValue[2]只取最低12有效数据
ADC_ConvertedValueLocal[] =(float)(ADC_ConvertedValue[]&0xFFF)*3.3/; // ADC_ConvertedValue[3]只取最低12有效数据 printf("CH1_PC0 value = %d -> %fV\n",ADC_ConvertedValue[]&0xFFF,ADC_ConvertedValueLocal[]);
printf("CH2_PC1 value = %d -> %fV\n",ADC_ConvertedValue[]&0xFFF,ADC_ConvertedValueLocal[]);
printf("CH3_PC2 value = %d -> %fV\n",ADC_ConvertedValue[]&0xFFF,ADC_ConvertedValueLocal[]);
printf("CH4_PC3 value = %d -> %fV\n",ADC_ConvertedValue[]&0xFFF,ADC_ConvertedValueLocal[]); printf("已经完成AD转换次数:%d\n",DMA_Transfer_Complete_Count);
DMA_Transfer_Complete_Count=;
printf("\n");
}
交叉模式---目的是两路ADC采集一路信号,可以获取双倍速度
/* 启动AD转换并使能DMA传输和中断 */
HAL_ADC_Start(&hadcx2);
HAL_ADCEx_MultiModeStart_DMA(&hadcx1,&ADC_ConvertedValue,sizeof(ADC_ConvertedValue)); //开启 /* 无限循环 */
while ()
{
HAL_Delay();
/* 3.3为AD转换的参考电压值,stm32的AD转换为12bit,2^12=4096,
即当输入为3.3V时,AD转换结果为4096 */
ADC_ConvertedValueLocal[] =(float)(ADC_ConvertedValue&0xFFF)*3.3/; //ADC1
ADC_ConvertedValueLocal[] =(float)((ADC_ConvertedValue>>)&0xFFF)*3.3/; //ADC2 printf("ADC1转换原始值 = 0x%04X --> 电压值 = %f V \n", ADC_ConvertedValue&0xFFFF,ADC_ConvertedValueLocal[]);
printf("ADC2转换原始值 = 0x%04X --> 电压值 = %f V \n", (ADC_ConvertedValue>>)&0xFFFF,ADC_ConvertedValueLocal[]);
printf("已经完成AD转换次数:%d\n",DMA_Transfer_Complete_Count);
printf("\r\n");
DMA_Transfer_Complete_Count=;
}
DAC---数据转换
基本配置:
初始化
设置通道
启动DAC
在循环中改变dac_value值即可
库函数:
/* IO operation functions *****************************************************/
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment); //需要函数中不断开启
HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);
uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel); /* 初始化DAC */
MX_DAC_Init();
/* 设置DAC通道值 */
HAL_DAC_SetValue(&hdac, DACx_CHANNEL, DAC_ALIGN_8B_R, dac_value);
/* 启动DAC */
HAL_DAC_Start(&hdac, DACx_CHANNEL); /* 无限循环 */
while ()
{
/* KEY1增加输出电压 */
if(KEY1_StateRead()==KEY_DOWN)
{
if(dac_value<)
dac_value+=;
else
dac_value=;
HAL_DAC_SetValue(&hdac, DACx_CHANNEL, DAC_ALIGN_8B_R, dac_value); //设置值
}
/* KEY2减少输出电压 */
if(KEY2_StateRead()==KEY_DOWN)
{
if(dac_value>)
dac_value-=;
else
dac_value=;
HAL_DAC_SetValue(&hdac, DACx_CHANNEL, DAC_ALIGN_8B_R, dac_value);
}
}
输出正弦波----DMA模式
就是预设一组值,不断改变
const uint16_t CH_value[] = {
,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,
};
int main(void)
{
/* 复位所有外设,初始化Flash接口和系统滴答定时器 */
HAL_Init();
/* 配置系统时钟 */
SystemClock_Config();
/* 初始化DAC */
MX_DAC_Init();
/* 启动定时器 */
HAL_TIM_Base_Start(&htim6);
/* 启动DAC DMA功能 */
HAL_DAC_Start_DMA(&hdac,DACx_CHANNEL,(uint32_t *)CH_value,,DAC_ALIGN_12B_R);
/* 无限循环 */
while ()
{
}
}
STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置的更多相关文章
- STM32 HAL库学习系列第5篇 定时器TIM---编码器接口模式配置
cube基本配置,外设开启编码器,串口2 可能大家在设置的时候有这个错误 错误:error: #20: identifier "TIM_ICPOLARITY_BOTHEDGE" ...
- STM32 HAL库学习系列第8篇---回调函数总结
普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返 ...
- STM32 HAL库学习系列第6篇---定时器TIM 级联配置
应用情景 使用定时器配置编码器模式,发现STM32只有两个定时器是32位,16位的测量值不够用,发现是可以使用两个16位定时器级联为32位的. 我是在使用编码器计数电机转速时使用,但是最终实现的效果不 ...
- STM32 HAL库学习系列第4篇 定时器TIM----- 开始定时器与PWM输出配置
基本流程: 1.配置定时器 2.开启定时器 3.动态改变pwm输出,改变值 HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); 函数总结: __HAL_TIM ...
- STM32 HAL库学习系列第3篇 常使用的几种延时方式
1 自带的hal_delay 函数 毫秒级延迟 void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick( ...
- STM32 HAL库学习系列第2篇 GPIO配置
GPIO 库函数 基本就是使用以下几个函数 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void H ...
- STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能
测量脉冲宽度或者测量频率 基本方法 1.设置TIM2 CH1为输入捕获功能: 2.设置上升沿捕获: 3.使能TIM2 CH1捕获功能: 4.捕获到上升沿后,存入capture_buf[0], ...
- STM32 HAL库学习系列---定时器TIM 输入捕获功能
基本方法 1.设置TIM2 CH1为输入捕获功能: 2.设置上升沿捕获: 3.使能TIM2 CH1捕获功能: 4.捕获到上升沿后,存入capture_buf[0],改为捕获下降沿: 5.捕获到下降沿后 ...
- 【书籍连载】《STM32 HAL 库开发实战指南—基于F7》-第一章
从今天起,每天开始连载一章<STM32 HAL 库开发实战指南—基于F7>.欢迎各位阅读.点评.学习. 第1章 如何使用本书 1.1 本书的参考资料 本书参考资料为:<STM32 ...
随机推荐
- csv注入漏洞原理&&实战
前言 为了找工作,巩固巩固知识.本文会介绍 csv 注入漏洞的原理,最后给出一个示例. 正文 在 csv 文件 和 xlsx 文件中的每一项的值如果是 =, @, +, - 就会被 excel 识 ...
- 测试、集成等领域最好的Java工具
无论你是刚入门,还是进行了一段时间的开发,使用合适的工具编程都会让你事半功倍,它能够让你更快的编写代码,能够快速及时的为你识别出Bug,能够让你的代码质量更上一层楼. 如果你选择的编程语言是Java, ...
- RMAN恢复脚本案例
$ crontab -l0 12,19 * * * $ORACLE_HOME/scripts/arcbkup.sh59 03 * * * $ORACLE_HOME/scripts/dbbkup.sh ...
- [错误记录]python requests库 Response 判断坑
在requests访问之后, 我直接判断resp的值, 如下: if resp: do something 发现当Response 为500的时候没有进入if分支, 检查源码,发现Response重写 ...
- selenium安装浏览器驱动
3.0以上版本恩的selenium需要安装驱动 pip show selenium 安装驱动 1.下载驱动地址: 火狐:https://github.com/mozilla/geckodriver/r ...
- java一个字符串中出现次数最多的字符以及次数
学习了别人的方法,觉得挺巧妙的.就是每次取出字符串的第一个字符,将字符串中与第一个字符相同的字符全部删除掉,然后通过计算删除前后字符串的长度来确定该字符在字符串中出现的次数,最终比较出出现最多次的字符 ...
- thusc2018真退役记
$day1$: 看了三道题,感觉这次特别毒瘤啊.. $t1$想了一会儿,发现是个傻逼题,然后切掉了. $t2$想了很久,不会,先去搞题答. 题答搞了很久,只搞出第一个点,后面的点根本没看出是什么意思. ...
- 情绪ABC理论
美国著名心理学家阿尔伯特·艾利斯 [Albert Ellis 1913.09.27]于20世纪50年代创立, 其理论认为引起人们情绪困扰的并不是外界发生的事件,而是人们对事件的态度.看法.评价等认知内 ...
- 3942: [Usaco2015 Feb]Censoring
3942: [Usaco2015 Feb]Censoring Time Limit: 10 Sec Memory Limit: 128 MB Submit: 964 Solved: 480 [Subm ...
- Python学习之路 (三)爬虫(二)
通用爬虫和聚焦爬虫 根据使用场景,网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种. 通用爬虫 通用网络爬虫 是 捜索引擎抓取系统(Baidu.Google.Yahoo等)的重要组成部分.主要目的是将互联 ...