目录
时钟树![](https://img-blog.csdnimg.cn/3ee2e95ad12f4d6994daf2eb277c8b7e.png)
TIP:要想输出0V电压,需要关闭输出缓冲
DAC输出指定电压(1)
0-4095(0-3.3v)
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 4095); HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
实验现象
DAC输出指定电压(2)
配置如上,仅为软件代码思路
void DAC1_Set_Vol(uint16_t voltage) { if((voltage<=3300)&&(voltage>=0)) { double temp=voltage; temp/=1000; temp=temp*4095/3.3; HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,temp); } else{ HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,0); //BB- or LED lighting } }
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
DAC1_Set_Vol(4200);
代码很简单一个的逻辑判断,看设置电压符不符合(0-3300),符合执行,不符合进入保护,无输出,BB-鸣叫和红色故障灯亮起
DAC输出方波(HAL_DELAY)
DAC1_Set_Vol(3300); HAL_Delay(1); DAC1_Set_Vol(0); HAL_Delay(1);
这个没啥讲的
DAC输出方波(定时器中断)
定时器配置
![]()
变量
/* USER CODE BEGIN PV */ int n=0,state=0; /* USER CODE END PV */
/* USER CODE BEGIN 0 */ void DAC1_Set_Vol(uint16_t voltage) { if((voltage<=3300)&&(voltage>=0)) { double temp=voltage; temp/=1000; temp=temp*4095/3.3; HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,temp); } else{ HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,0); //BB- or LED lighting } } /* USER CODE END 0 */
使能
/* USER CODE BEGIN 2 */ HAL_DAC_Start(&hdac,DAC_CHANNEL_1); HAL_TIM_Base_Start_IT(&htim2); /* USER CODE END 2 */
主函数
/* USER CODE BEGIN 3 */ if(state==1) { DAC1_Set_Vol(3300); } if(state==2) { DAC1_Set_Vol(0); } } /* USER CODE END 3 */
中断回调
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim==&htim2){ n=n+1; if(n<100) state=1; if(n>100) state=2; if(n>201) n=0; } }
定时器计数,大约72*10^6/72/500=2000HZ触发一次中断,在0-99个周期内输出3.3v,101-201周期内输出0v(代码逻辑判断那数值不妥,自行更改,这里仅讲思路)
实验现象
DAC输出阶梯波
a+=100;
DAC1_Set_Vol(a);
HAL_Delay(1);//或者用定时器中断思路替代
DAC输出三角波
配置定时器参数,up event
配置DAC输出通道,利用内置波形发生器,设置定时器触发,输出幅值4095
![]()
编写代码
![]()
通道一
HAL_TIM_Base_Start(&htim2); HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
实验现象
三角波幅值为3.3V,即4095,所以一个周期计数器计数4096*2=8192次,则三角波频率为“定时器频率/8192”
即(72*10^6)/72/500/8192=0.2441HZ 符合示波器测的值
DAC输出正弦波
将正弦波进行取样,得到一个数组,比如对0~3.3V的正弦波进行32个或者更多的采样,计算得到对应的要写入的数值,构成一个数组。然后依次将这些数据写进去。
uint32_t SinData[256]={2048, 2098, 2149, 2199, 2250, 2300, 2350, 2399, 2449, 2498, 2548, 2596, 2645, 2693, 2741, 2788, 2835, 2881, 2927, 2972, 3017, 3061, 3105, 3148, 3190, 3231, 3272, 3312, 3351, 3390, 3428, 3465, 3501, 3536, 3570, 3603, 3636, 3667, 3697, 3727, 3755, 3783, 3809, 3834, 3858, 3881, 3903, 3924, 3944, 3962, 3980, 3996, 4011, 4025, 4037, 4049, 4059, 4068, 4075, 4082, 4087, 4091, 4094, 4095, 4095, 4095, 4093, 4089, 4085, 4079, 4072, 4063, 4054, 4043, 4031, 4018, 4003, 3988, 3971, 3953, 3934, 3914, 3892, 3870, 3846, 3822, 3796, 3769, 3741, 3712, 3682, 3651, 3620, 3587, 3553, 3518, 3483, 3446, 3409, 3371, 3332, 3292,3252, 3211, 3169, 3126, 3083, 3039, 2995, 2950, 2904, 2858, 2811, 2764, 2717, 2669, 2621, 2572, 2523, 2474, 2424,2375, 2325, 2275, 2224, 2174, 2124, 2073, 2023, 1972, 1922, 1872, 1821, 1771, 1721, 1672, 1622, 1573, 1524, 1475, 1427, 1379, 1332, 1285, 1238, 1192, 1146, 1101, 1057, 1013, 970, 927, 885, 844, 804, 764, 725, 687, 650, 613, 578, 543, 509, 476, 445, 414, 384, 355, 327, 300, 274, 250, 226, 204, 182, 162, 143, 125, 108, 93, 78, 65, 53, 42, 33, 24, 17, 11, 7, 3, 1, 0, 0, 2, 5, 9, 14, 21, 28, 37, 47, 59, 71, 85, 100, 116, 134, 152, 172, 193, 215, 238, 262, 287, 313, 341, 369, 399, 429, 460, 493, 526, 560, 595, 631, 668, 706, 745, 784, 824, 865, 906, 948, 991, 1035, 1079, 1124, 1169, 1215, 1261, 1308, 1355, 1403, 1451, 1500, 1548, 1598, 1647, 1697, 1746, 1796, 1846, 1897, 1947, 1998, 2048};
HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
for(int x=0;x<sizeof(SinData)/sizeof(SinData[0]);x++){ HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,SinData[x]); }
实验现象