STM32CubeMX(08)定时器+ DAC+DMA输出正弦波实验。
Posted 学工科的皮皮志^_^
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32CubeMX(08)定时器+ DAC+DMA输出正弦波实验。相关的知识,希望对你有一定的参考价值。
前言
我们前面讲了输出了阶梯波实验
STM32CubeMX(07)定时器+ DAC+DMA输出阶梯波实验。
今天我们来输出正弦波,其实我们很容易发现其中的规律,就是输出相应的AD值就可以了。
一、练习
【功能】定时器触发DAC转换,使用DMA方式触发 ,在DAC通道1输出正弦波。
【参数计算&设置】 定时器6定时参数(APB1总线,84MHz):20.5KHz
== PSC=15, ARR=255,== 则定时器更新周期为 84MHz/(16*256)=20.5KHz 若正弦波每个周期32个采样点,则每个正弦波周期为 :20.5KHz/32=640Hz
二、思路
首先在数学上我们要理清楚
V=sin(t),t属于[0:2π],sin(t)的范围是[-1:1],因为DA不能输出所以我们要抬升V=sin(t)+1,范围是[0:2],
写到寄存器的值的范围是[0:4096],所以2048*(sin(t)+1)的范围就是[0:4096]
需要多少个点只需要把2π分成多少份就可以了
所以转化成C语言就是
== 2048*(sin((2.0PIi)/(Point_Num-1))+1)==
然后封装成一个函数就是
void SineWave_Data( uint16_t cycle ,uint16_t D)
{
uint16_t i;
for( i=0;i<cycle;i++)
{
D[i]=2048(sin((2.0PIi)/(Point_Num-1))+1);
}
}
三、参数修改
我们在tim.c的基础上修改一下就可以了,改一下分频系数和装载值。
然后在main.c中添加如下变量和函数
然后在main函数中初始化好,就可以了,编译,烧录
四、测试结果
可以看到我们的频率时符合我们的理论值,那为啥看起来这么离散,原因是点数太少了,一个正弦波用32个点来表示,其实已经很勉强了。
总结
那么方波,三角波,甚至是任意波,都是一样的道理。我这里就不着重讲了,只要推出数学表达式就可以了,今天的总结到此结束,希望能够帮助到大家。
void SineWave_Data( uint16_t cycle ,uint16_t *D) //正弦波
{
u16 i;
for( i=0;i<cycle;i++)
{
D[i]=2048*(sin((2.0*PI*i)/(Point_Num-1))+1);
}
}
void Triangle_Data(uint16_t cycle ,uint16_t *D) //三角波
{
u16 i;
for( i=0;i<cycle;i++)
{
if(i<=cycle/2)
{
D[i]=i*(4096.0/(cycle/2));
}
else
D[i]=i*(-4096.0/(cycle/2))+2*4096;
}
}
void Square_Data(uint16_t cycle ,uint16_t *D) //方波
{
u16 i;
for( i=0;i<cycle;i++)
{
if(i<=cycle/2)
{
D[i]=0;
}
else
D[i]=4095;
}
}
以上是关于STM32CubeMX(08)定时器+ DAC+DMA输出正弦波实验。的主要内容,如果未能解决你的问题,请参考以下文章
STM32CubeMX(07)定时器+ DAC+DMA输出阶梯波实验。
STM32F103VET6基于STM32CubeMX 配置DAC-三角波输出示例