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 ()
{ }
}

2019-03-26

最新文章

  1. windows7-SQLyog 安装图解
  2. redis pipeline
  3. iphone document 图片存储和读取
  4. IntelliJ IDEA 15 设置默认浏览器
  5. xml复习
  6. bootstrap table 服务器端分页例子分享
  7. MSSQLSERVER数据库- 打开表出现目录名无效
  8. Excel 国家甘特图(多图)
  9. UVA 714 Copying Books 最大值最小化问题 (贪心 + 二分)
  10. OC中文件的操作
  11. vue2入坑随记(二) -- 自定义动态组件
  12. Zabbix实战-简易教程(3)--DB安装和表分区
  13. Linux环境 tp5.1 Could not open input file: think
  14. 迭代和JDB(课下作业,选做)
  15. SQLite异常 qAdmin: Cannot perform this operation on a closed dataset.【申明:来源于网络】
  16. 第61章 IdentityServer Options - Identity Server 4 中文文档(v1.0.0)
  17. 洛谷P4057
  18. hadoop streaming 中跑python程序,自定义模块的导入
  19. CodeForces 935E Fafa and Ancient Mathematics (树形DP)
  20. java微信分享

热门文章

  1. textarea显示默认值
  2. redis介绍(5)主从复制
  3. Maven安装及MyEclipse中使用Maven
  4. android 常用adb 及linux 命令
  5. Python下操作sqlite3
  6. Hadoop HBase概念学习系列之HBase里的列式数据库(十七)
  7. mysql的表和约束操作
  8. 3星|《结构思考力》:用金字塔原理整理PPT的思路,案例偏简单
  9. &lt;Lord don’t move that mountain&gt;
  10. pathlib