cubemx配置adc输出
一直想说做一个产生任意波形的dac怎么实现,研究了一下,算做个总结吧
b站和csdn找了一些视频和资料整理一下
首先本实验实现了三个任务:
1.产生任意电压
2.产生三角波
3.利用dma产生正弦波,当然也可以产生任意波形
每个小实验分为量部分讲解,分别是cubemx和keil代码
都要配置RCC和SYS这里不再赘述
1.产生任意电压
step1:
分析:这里注意打开了buffer过后是不能产生0v的
step2:
/*产生任意电压*/
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,4095);
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);//开启DAC通道
分析:这里的dac_setvalue函数有两个参数值得注意,DAC_ALIGN_12B_R和4096,一般在16位的存储中,我们都是选用12位右对齐的(左对齐我也试过,这里测出来是200mv,具体我也没细想),然后是4096,因为是选用的12位右对齐,12位最大就是4095,这里就直接3.3*(x/4095)得到电压
2.利用定时器实现三角波输出
需要用到的外设有timer和dac
step1:timer
只需要配置一下分频系数和update event,频率计算等会说
step2:
分析:选取对应的定时器触发和产生三角波,和最大的幅度4095和上面同理,就是12位的,另外顺带一提这个参数也会改变频率,它也表示取了多少个点出来
step3:
/*产生三角波*/
HAL_TIM_Base_Start(&htim6);
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_8B_R,0x100);
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);//开启DAC通道
这里首先时基初始化对应的timer,然后setvalue的目的是确定最小的电压,0x100和上面同理就是256,但是注意和上面那个最大幅度搭配起来可能导致溢出,就顶端出现在下方,相当于25++4095那肯定超出范围然后从0开始了
然后开启
最后说一说频率,从最高到最低一个来回,72M/(71+1)/4096/2
1/
3.利用dma产生正弦波
step1:timer的配置不变
step2:DAC的配置
关掉波形产生,和第一个产生任意电平相同
增加dma
step3:
①
利用软件产生正弦波的点,我这里直接使用产生spwm用到的小软件
生成数组
主函数:
HAL_TIM_Base_Start(&htim6);
HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,(uint32_t*)sine_8bit,256,DAC_ALIGN_8B_R); HAL_DAC_Start(&hdac,DAC_CHANNEL_1);//开启DAC通道
频率就是72M/(71+1)/点的个数
总结:如果要产生任意波形
首先可以用matlab或者python算出点,然后把对应的点存成一个数组,然后输出出来
DAC+TIM+DMA