设为首页 加入收藏

TOP

STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置(一)
2019-08-27 07:22:13 】 浏览:58
Tags:STM32 HAL 学习 系列 1篇 ADC 配置 DAC

ADC工作均为非阻塞状态

轮询模式

中断模式

DMA模式


 

库函数:

 1 HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放在循环中不断开启
 2 
 3 HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc);
 4 
 5 HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);//等待转换结束,只适用于轮询
 6 
 7 HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventType, uint32_t Timeout);//
 8 
 9 HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);//中断模式
10 
11 HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);
12 
13 void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc);//中断
14 
15 HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);//DMA模式
16 
17 HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);
18 
19 uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc); //读取ADC的值
20 
21 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);//结束后回调
22 
23 void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc);//转换过程中回调
24 
25 void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc);
26 
27 void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc);

 

 

校准模式:

校准ADC(HAL_ADCEx_Calibration_Start(&hadc);有些芯片不支持校准,F4不支持

----------------------------------------------------------------------------------------------------------------------------------

可变占空比设置

 1 /*
 2 
 3 实际使用时空置引脚状态下会飘动,大致为3.3V的一半,是芯片内部的原因
 4 
 5 解决方式:引脚设置为下拉输入,F4没有这个设置
 6 
 7 */
 8 
 9 /* USER CODE BEGIN 2 */
10 
11 //  HAL_ADC_Start_IT(&hadc1);//开启ad转换
12 
13     HAL_TIM_Base_Start_IT(&htim3);//定时器中断
14 
15   HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//开启输出pwm
16 
17   /* USER CODE END 2 */
18 
19   /* Infinite loop */
20 
21   /* USER CODE BEGIN WHILE */
22 
23   while (1)
24 
25   {
26 
27   /* USER CODE END WHILE */
28 
29   /* USER CODE BEGIN 3 */
30 
31         float pwmOut ;
32 
33         float dutyRatio;
34 
35         int lastTickMs=0;
36 
37         HAL_ADC_Start(&hadc1);
38 
39         
40 
41         if(HAL_GetTick() - lastTickMs >= 1000)
42 
43     {
44 
45         HAL_GPIO_TogglePin(RUNNING_LED_GPIO_Port,RUNNING_LED_Pin);
46 
47         lastTickMs = HAL_GetTick();      
48 
49     }
50 
51     HAL_Delay(1000);
52 
53         adcConvertedValue=HAL_ADC_GetValue(&hadc1);//获取AD转换值
54 
55     adcConvertedVoltage =(double)adcConvertedValue*3.3/4096;        
56 
57         
58 
59         pwmOut = adcConvertedValue*2400/4096;
60 
61         dutyRatio = pwmOut/2400 ;
62 
63         TIM3->CCR2 = pwmOut;    //(pwmOut)/ 2400    change Duty ratio
64 
65         
66 
67         printf("AD转换原始值 = %d\r\n", adcConvertedValue);
68 
69         printf("计算得出电压值 = %f V \r\n",adcConvertedVoltage);
70 
71         printf("实际输出pwm值 = %f\r\n", pwmOut);
72 
73         printf("占空比 = %f%%\r\n",dutyRatio*100);
74 
75   }
76 
77   /* USER CODE END 3 */
78 
79 }

 

 

手动更改占空比

TIM3->CCR2   改变占空比

?

TIM3->ARR 改变频率

TIM3->PSC 

ADC_EXIT  触发引脚

 

32芯片自带的温度传感器,在16或者18通道

可以用来做对比

?

代码:

 1 //对于12位的ADC,3.3V的ADC值为0xfff,温度为25度时对应的电压值为1.43V即0x6EE
 2 #define V25  0x6EE
 3 //斜率 每摄氏度4.3mV 对应每摄氏度0x05
 4 #define AVG_SLOPE 0x05
 5   
 6 
 7 /* 启动AD转换并使能DMA传输和中断 */
 8   HAL_ADC_Start_DMA(&hadcx,(uint32_t *)&ADC_ConvertedValue,sizeof(ADC_ConvertedValue)); 
 9  
10   /* 无限循环 */
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Cortex-M 实现互斥操作的三种方法 下一篇wiringPi库的pwm配置及使用说明

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目