【Follow me第二季第3期】扩展任务-简易信号发生器项目DSP版
[复制链接]
1、项目介绍
本项目使用mcu的DSP作为计算引擎,通过控制DAC每个周期的输出生成正弦函数信号,通过控制取值的步长控制周期。
思路设计:
1.user key 1(用户按键1):控制信号的频率,控制修改timer的计时间隔。
2.user key 2(用户按键1):控制信号是否输出,信号关闭时,按键开启输出。信号输出时,按键关闭输出。
3.串口输出项目运行信息
4.系统使用固定时常作为DAC电压输出计时控制,通过计算值作为信号发生器的信号波形值。
2、项目过程
本来使用vscode+cmake组合来开发项目,但是计算正弦函数的时候无法引用函数,所以尝试使用DSP库作为数学函数的计算程序。本次测试就是使用DSP的版本。
配置过程,除了软件栈之外,需要勾选CMSIS5-DSP软件组件包。这个非常重要。
还有一处关键DAC配置,需要打开输出过滤。否则无法输出
配置完成后,创建项目。
3、程序代码
(1)使用vscode打开代码。增加arm_math.h引用。
#include <math.h>
#include <arm_math.h>
关键的是将标准库math.h中的sin()修改为arm_sin_f32()函数。
while (1)
{
if(g_sw1_press)
{
freq = (uint16_t) ( freq + 1 )%10;
g_sw1_press = false;
APP_ERR_PRINT("Freg Add\r\n");
}
if(g_sw2_press)
{
g_dac_sw = !g_dac_sw;
if(g_dac_sw)
{
APP_ERR_PRINT("OUT ON\r\n");
}
else
{
APP_ERR_PRINT("OUT OFF\r\n");
}
g_sw2_press = false;
}
cycle += cyclePien/(freq+1);
if (cycle >= (2 * PI))
{
cycle = 0;
}
//dac_value = (sin(cycle) + 1) * 2047;
dac_value = (arm_sin_f32(cycle) + 1) * 2047;
if(!g_dac_sw)
{
dac_value = 0;
}
output = (uint16_t) dac_value;
err = R_DAC_Write (&g_dac0_ctrl, output);
//err = R_DAC_Start (&g_dac0_ctrl); R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);
/* Delay */
//R_BSP_SoftwareDelay(delay, bsp_delay_units);
}
}
关键代码如上。
(2)编译构建
需要注意,先使用cmake configure命令。然后执行构建过程。
将程序烧录到开发板。
4、测试过程
按键user1 ,开启输出。
按键user2 ,改变频率。
|