【Follow me第二季第3期】扩展任务信号发生器
[复制链接]
本帖最后由 一只小跳帽 于 2024-12-8 21:04 编辑
今天实现最为困难的信号发生器
我设置了这几种功能
采集ADC的值并且保存到flash中可以进行DAC复现输出
首先实现ADC采集的功能代码如下
R_ADC_Open (&g_adc_ctrl, &g_adc_cfg);
R_ADC_ScanCfg (&g_adc_ctrl, &g_adc_channel_cfg);
static uint16_t g_adc_data;
char print_str[100] = "";
uint16_t ADC_value[5001];
print_to_console ("现在采集AD值并且打印\r\n");
for (int i = 0; i < 5000; i++)
{
R_ADC_Read (&g_adc_ctrl, ADC_CHANNEL_0, &g_adc_data);
ADC_value[i] = g_adc_data;
sprintf (print_str, "%d\r\n", g_adc_data);
print_to_console (print_str);
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);
}
//保存到flash中
saveToFlash (ADC_value);
print_to_console("存储完成");
最后再加入存储到flash中的代码即可
功能就是循环保存数据5000个
下面我们看下实际的效果 连接图如下端口为p000
采集到的数据如下
输入1
可以采到值并且保存
下面看斜波和正弦波的触发和上一个任务的代码是相同的
代码如下
void DAC_output()
{
R_DAC_Open (&g_dac0_ctrl, &g_dac0_cfg);
R_DAC_Start (&g_dac0_ctrl);
float a = 0;
float out;
while (1)
{
switch (MODE)
{
case SIN_MODE:
{
a += 0.1;
if (a > 2 * PI)
a = 0;
out = map_float (sin (2 * a), -1, 1, 0, 4096);
}
break;
case OBL_MODE:
{
a += 1;
if (a >= 4096)
a = 0;
out = a;
}
break;
case ADC_MODE:
{
a += 1;
if (a >= 5000)
{
a = 0;
}
out= flash_value[(int)a];
}
// int f= flash_value[a];
break;
}
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);
R_DAC_Write (&g_dac0_ctrl, (uint16_t) out);
}
}
使用ARDUINR4 进行查看波形
下面尝试将flash中的通过DAC输出
这里的打印一直为gnd后续我们可以再次查看
好的本个代码大致完成更详细的可以查看下方的视频
|