DAC多种入门玩法(STM32)

目录

 时钟树​

TIP:要想输出0V电压,需要关闭输出缓冲

DAC输出指定电压(1)

DAC输出指定电压(2)

DAC输出方波(HAL_DELAY)

DAC输出方波(定时器中断)

DAC输出阶梯波

DAC输出三角波

DAC输出正弦波


 时钟树

 

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]);
  }

实验现象

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜浩鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值