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输出阶梯波实验。

STM32cubemx教程 DAC+TIM+DMA

STM32F103VET6基于STM32CubeMX 配置DAC-三角波输出示例

STM32F4HAL库 CubeMX(十五)--------DAC实验

STM32CubeMX-定时器产生PWM驱动舵机

STM32 TIM DAC 和 DMA