1、【野火启明6M5开发板体验】野火启明6M5开箱:
https://bbs.elecfans.com/jishu_2324111_1_1.html
第一篇测评介绍了开发板的开箱和项目的建立,本篇利用可调频正弦波发生器介绍一下该单片机的ADC、DAC和定时器模块的使用。
一、设计思路
利用100ms的定时器,定时触发对开发板上的电位器输出电压的AD转换,在程序中预存一个128点的正弦波数据,将这些数据等时间间隔利用DAC进行转换,通过AD转换结果控制DAC的时间间隔,最终实现输出频率可调的正弦波。
由于在其他帖子中已经介绍了项目的建立,本篇测评只介绍ADC、DAC和定时器的设置和编程。
二、ADC设置与编程
1、模块设置
首先将P000设置为AD口的通道0,如下图所示。
点击Stack-New Stack-Analog-ADC增加ADC模块。
设置AD口的属性
设置AD口的中的中断参数。
主要设置ADC的中断回调函数“adc_callback”和中断优先级“Prioriy 2”。
2、软件设计
在模块设置中,已经对ADC的部分参数进行了设置,在自动生成代码后,只要调用对应的结构体,对模块进行设置即可。
void adc_Init(void)
{
fsp_err_t err;
err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
assert(FSP_SUCCESS == err);
}
由于在模块设置中,设置了回调函数,因此需要将回调函数实现。
void adc_callback(adc_callback_args_t * p_args)
{
FSP_PARAMETER_NOT_USED(p_args);
}
在编程的时候,没有用到该回调函数。
三、DAC设置与编程
1、模块设置
首先设置DAC引脚,其中P014对应的是DAC0,P015对应的是DAC1,设置界面如下。
点击Stack-New Stack-Analog-DAC增加DAC模块。
对DAC模块进行设置
对于DAC的设置,只需设置channel的引脚即可。
2、软件设计
void dac_Init(void)
{
R_DAC_Open(g_dac0.p_ctrl, g_dac0.p_cfg);
R_DAC_Start(g_dac0.p_ctrl);
}
dac0的参数在模块设置中已经设置完成,只需要打开该模块即可。
四、定时器设置与编程
1、模块设置
点击Stack-New Stack-Timers-Timers,General PWM增加定时器模块。
定时器设置参数如下
设置定时器为通道0、周期性定时模式、周期单位为毫秒,周期为100ms,设置定时器0的中断回调函数为timer0_callback,中断优先级为2。
2、软件设计
void GPT_Timing_Init(void)
{
R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);
R_GPT_Start(&g_timer0_ctrl);
}
void timer0_callback(timer_callback_args_t * p_args)
{
if (TIMER_EVENT_CYCLE_END == p_args->event)
{
R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data);;
(void)R_ADC_ScanStart(&g_adc0_ctrl);
}
}
需要在软件中将定时器打开。因为本程序需要进行等间隔的AD采样,所以每次定时器中断都进行AD结果的读取和AD转换的启动。该单片机的AD可以由定时器自动触发,但是我尝试了几次都没有成功,只好采用这种笨办法,希望各专家能指导一下。
五、主程序设计
主程序采用循环的方式执行,利用读取的ADC结果,控制DAC输出的时间间隔,进而改变输出正弦波的频率。
void hal_entry(void)
{
uint16_t p=0;
adc_Init();
(void)R_ADC_ScanStart(&g_adc0_ctrl);
GPT_Timing_Init();
dac_Init();
while(1)
{
if(adc_data<50)
adc_data=50;
p=(uint32_t)adc_data*2000/4095;
R_BSP_SoftwareDelay(p,BSP_DELAY_UNITS_MICROSECONDS);
R_DAC_Write(g_dac0.p_ctrl, sin_tab[index1]);
index1+=1;
if(index1>=128)
index1=0;
R_DAC_Write(g_dac1.p_ctrl, 3000);
}
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}
六、实现效果