前言
我们前面讲了输出了阶梯波实验 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;
}
}
|