HC32F4A0开发板DAC信号发生测试
1概述
1.1开发板接口
HC32F4A0搭载了两个12位的数字-模拟电压转换器单元DAC1和DAC2。每个DAC单元包含两个D/A转换通道,可以独立转换也可以通过转换数据的同步更新实现同步转换。每个转换通道配有一个输出放大器,可以在没有外部运放时直接驱动外部负载。独立管脚输入参考电压VREFH和VREFL可用来提高转换精度。
参考官方提供的例程,计划产生正弦波、方波、锯齿波、三角波四种波形,使用按键K1 ~ K5来控制波形的产生和关闭。
1.2开发板原理图
DAC外围电路和引脚分配如图1、2所示。
图1 DAC外围电路示意图
图2 引脚分配图
1.3测试设备
本次测试所用设备如表1所示,设备实物图连接图如图3所示:
测试设备
|
单位 |
数量 |
EV_F4A0_LQ176_REV1.0开发板 |
块 |
壹 |
ARM仿真器 |
个 |
壹 |
5V电源适配器 |
个 |
壹 |
RIGOL DHO804示波器 |
台 |
壹 |
表1 测试设备
图3 开发板实物连接图
2代码编写
方波产生函数
static void Pulse_Init(uint32_t pPulseTable[], uint32_t u32count)
{
uint32_t i;
float32_t pulse;
for (i = 0U; i < u32count; i++) {
if(i<=u32count/2-1)
pulse=u32count;
else
pulse=0;
#if (DAC_DATA_ALIGN == DAC_DATA_ALIGN_LEFT)
{
pPulseTable[i] = (uint32_t)pulse << 9;
}
#else
{
pSinTable[i] = (uint32_t)fSin;
}
#endif
}
}
锯齿波产生函数
static void Sawtooth_Init(uint32_t pSawTable[], uint32_t u32count)
{
uint32_t i;
float32_t sawtooth;
for (i = 0U; i < u32count; i++) {
sawtooth=i;
#if (DAC_DATA_ALIGN == DAC_DATA_ALIGN_LEFT)
{
pSawTable[i] = (uint32_t)sawtooth << 9;
}
#else
{
pSinTable[i] = (uint32_t)fSin;
}
#endif
}
}
三角波产生函数
static void Triangle_Init(uint32_t pTriangleTable[], uint32_t u32count)
{
uint32_t i;
uint32_t j=0;
float32_t triangle;
for (i = 0U; i < u32count; i++) {
if(i<=u32count/2-1)
j=j+1;
else
j=j-1;
triangle=j;
#if (DAC_DATA_ALIGN == DAC_DATA_ALIGN_LEFT)
{
pTriangleTable[i] = (uint32_t)triangle*2 << 9;
}
#else
{
pSinTable[i] = (uint32_t)fSin;
}
#endif
}
}
主函数
int32_t main(void)
{
uint16_t u16OutputCnt = 0U;
en_key_event_t enEvent;
uint8_t u8IsConversionStart = 0U;
uint32_t flag=0U;
LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU | \
LL_PERIPH_EFM | LL_PERIPH_SRAM);
BSP_CLK_Init();
BSP_IO_Init();
BSP_LED_Init();
BSP_KEY_Init();
/* Init MAU for generating sine data*/
MAU_Init();
/* Init sine data table */
static uint32_t gu32SinTable[SINE_DOT_NUMBER];
SinTable_Init(gu32SinTable, SINE_DOT_NUMBER);
static uint32_t gu32SawTable[SINE_DOT_NUMBER];
Sawtooth_Init(gu32SawTable, SINE_DOT_NUMBER);
static uint32_t gu32PulseTable[SINE_DOT_NUMBER];
Pulse_Init(gu32PulseTable, SINE_DOT_NUMBER);
static uint32_t gu32TriangleTable[SINE_DOT_NUMBER];
Triangle_Init(gu32TriangleTable, SINE_DOT_NUMBER);
DAC_ConversionInit();
LL_PERIPH_WP(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU | \
LL_PERIPH_EFM | LL_PERIPH_SRAM);
for (;;) {
enEvent = Key_Event();
switch (enEvent) {
case E_KEY1_PRESSED:
if (u8IsConversionStart == 1U) {
break;
}
flag=1;
u16OutputCnt = 0U;
u8IsConversionStart = 1U;
BSP_LED_On(LED_BLUE);
DAC_StartConversion();
break;
case E_KEY2_PRESSED:
if (u8IsConversionStart == 1U) {
break;
}
flag=2;
u16OutputCnt = 0U;
u8IsConversionStart = 1U;
BSP_LED_On(LED_BLUE);
DAC_StartConversion();
break;
case E_KEY3_PRESSED:
if (u8IsConversionStart == 1U) {
break;
}
flag=3;
u16OutputCnt = 0U;
u8IsConversionStart = 1U;
BSP_LED_On(LED_BLUE);
DAC_StartConversion();
break;
case E_KEY4_PRESSED:
if (u8IsConversionStart == 1U) {
break;
}
flag=4;
u16OutputCnt = 0U;
u8IsConversionStart = 1U;
BSP_LED_On(LED_BLUE);
DAC_StartConversion();
break;
case E_KEY5_PRESSED:
if (u8IsConversionStart == 0U) {
break;
}
u8IsConversionStart = 0U;
DAC_StopConversion();
BSP_LED_Off(LED_BLUE);
break;
default:
break;
}
if (u8IsConversionStart == 0U) {
continue;
}
if (flag==1){
DAC_SetConversionData(gu32SinTable[u16OutputCnt]);
}
else if(flag==2){
DAC_SetConversionData(gu32SawTable[u16OutputCnt]);
}
else if(flag==3){
DAC_SetConversionData(gu32PulseTable[u16OutputCnt]);
}
else if(flag==4){
DAC_SetConversionData(gu32TriangleTable[u16OutputCnt]);
}
else{
}
/* Loop output */
if (++u16OutputCnt >= SINE_DOT_NUMBER) {
u16OutputCnt = 0U;
}
}
}
3实验现象
3.1实验现象分析
按下开发板上的K1、K2、K3、K4,示波器分别显示正弦波、锯齿波、方波、三角波,按下K5会关闭DAC输出。
3.2实验现象
如图4、5、6、7所示
图4 正弦波
图5 锯齿波
图6 方波
图7 三角波