【Follow me第二季第3期】扩展任务:简单信号发生器
[复制链接]
在DAC任务中已经实现了三角波和正弦波的生成,本次结合按键,使用按键选择输出的波形。
新增全局变量wave_select,当wave_select==0,输出三角波,当wave_select==1,输出正弦波。
在100ms任务扫描按键,根据按下的按键切换波形;在10ms任务中输出波形。
- void Timer_10msTask()
- {
- if(wave_select==0)
- {
- DAC_output();
- }
- else
- {
- DAC_output_Sinewave();
- }
- }
-
- void Timer_100msTask()
- {
- static uint8_t led1level=BSP_IO_LEVEL_LOW;
- if(keyscan(KEY_S1)==1)
-
- {
- wave_select=0;
-
-
-
- }else if(keyscan(KEY_S2)==1)
- {
- wave_select=1;
- }
-
- }
三角波和正弦波实现代码如下
-
- #include "dac.h"
- #include <math.h>
- #include <stdint.h>
- #include "haL_data.h"
-
- uint16_t gs_dac_value=0;
- uint64_t gs_starttime=0;
- uint16_t DAC_value=0;
- extern uint64_t gs_dwTick;
-
- fsp_err_t DAC_Init(void)
- {
- fsp_err_t status = R_DAC_Open(&g_dac0_ctrl, &g_dac0_cfg);
- status = R_DAC_Write(&g_dac0_ctrl, 0);
-
- status = R_DAC_Start(&g_dac0_ctrl);
- gs_starttime = gs_dwTick;
- return status;
- }
-
- fsp_err_t DAC_output(void)
- {
- static int16_t a=1;
- gs_dac_value=(uint16_t)(gs_dac_value+a);
- if(gs_dac_value>=0x0FFF)
-
- {
- a = -1;
- }
- else if (gs_dac_value == 0)
- {
- a = 1;
- }
-
- fsp_err_t status = R_DAC_Write(&g_dac0_ctrl, gs_dac_value);
-
- return status;
- }
-
- fsp_err_t DAC_output_Sinewave(void)
- {
- fsp_err_t ret;
- uint64_t currenttime=gs_dwTick;
-
- uint64_t t_ms=(currenttime-gs_starttime);
- double t_s =(double)t_ms/1000;
- DAC_value=(uint16_t)((sin(t_s)+1)/2*4096);
- gs_dac_value=DAC_value;
- ret = R_DAC_Write(&g_dac0_ctrl, gs_dac_value);
- return ret;
- }
-
实验现象:
将dac输出引脚和LED3使用杜邦线连接。
播放器加载失败: 未检测到Flash Player,请到 安装
20241215_234136
可以看到,运行后默认输出三角波,按下按键s2切换为正弦波,按下按键s1切换回三角波,由于从led看现象并不明显,所以使用freemaster直接查看gs_dac_value的值,这样直观一些。
|