STC32G144K246, DAC-DMA 输出, 离散信号输出,足够快成连续信号 !
需要注意以下问题:
1.DMA_DAC1_AMT的单位是16bit的,例如想要DMA传输50个16位的数据(数据最大不能超过12位)
则DMA_DAC1_AMT需要填入49(DMA_DAC1_AMT填0时为传输1字节,所以填入时需要减1)
2.DAC-DMA传输时,DAC1_DIV是和DMA_DAC1_ITV共同作用的
3.传入DAC的DMA数据,需要转换为小端模式,这里提供一个简单的函数,可以进行转换:
- //大小端交换,传入数组地址和所需转换数量(以16bit为单位)
- void swap_endian_uint16_array(unsigned int *arr, unsigned int count)
- {
- unsigned int i;
- unsigned short temp;
-
- for(i = 0; i < count; i++)
- {
- temp = arr[i];
- arr[i] = ((temp & 0x00FF) << 8) | ((temp & 0xFF00) >> 8);
- }
- }
复制代码
4.需要使用DAC-DMA模式时,DAC1_CR中,需要将转换模式配置为连续转换模式
DMA只管更新DMA_DAT,不会主动触发DAC TG,如果配置为单次转换或者其他定时器触发,仍然需要定时器触发或者软件触发DAC TG才能看到波形
否则,DAC将不会更新输出
5.DMA_DAC1_DONE寄存器,单位仍然为8bit,即一个字节,例如DMA_DAC1_AMT填入49,则全部转换完成后,将可以在DMA_DAC1_DONE读到100
6.DAC1_DIV和DAC1_DAT为16位寄存器,可以直接填入值,不需要拆分成8位填入,寄存器是否支持16位,请看头文件定义,是否为int类型
以下为在STC32G144K246核心板上验证通过的正弦波输出测试程序,上电自动在P63端口输出一个正弦波:
程序运行在120Mhz
程序采用4096点满分辨率输出,无需滤波,输出速度可达2.43KHz,无需RC滤波即可看到非常平滑的波形
想要DAC看不到阶梯感,使用较高的分辨率即可, 或加滤波/毕竟DAC输出是离散信号不是连续信号
STC32G144K246 DMA-DAC.zip
(60.67 KB, 下载次数: 10)
高分辨率下,放大后依然是看不出来阶梯感的
以下为完整程序:
复制代码
|