本帖最后由 lkl0305 于 2015-9-6 00:00 编辑
虽然YL-KL16Z的DAC模块还有一些问题,但是使用DAC的基本用法,终于生成了正弦波,其它方法随后再练习。给大家分享一下。
==================================================
一、问题描述:
想要使用DAC生成一个正弦波,主要练习YL-KL26Z的DAC模块的使用,这个DAC可是随后使用YL-KL26Z发声的基础,为播放音乐作准备。
二、解决方法:
1、首先采用DAC模块来实现
2、编程使用KDS3.0+KSDK1.2库,非PE
3、基本思路:
(1)正弦波数据使用事先生成,存放在FLASH中。
可参考:lkl0305——每天解决一个问题2 :EXCEL生成DAC用正弦波数据
https://www.nxpic.org.cn/module/forum/forum.php?mod=viewthread&tid=600763&fromuid=336767
(2)使用定时器PIT定时100us,每定时时间到,输出下一个正弦波数据。
(3)DAC模块采用最基本的配置,不使用中断和DAC缓冲,参考电压VDDA,软件触发DAC
4、DAC部分:
先定义DAC配置结构体
初始化DAC模块
需要DAC转换时,使用DAC_DRV_Output函数即可:
5、上个运行效果吧,在示波器上看到的效果,还行!
6、上个程序。
主程序:
- #include "fsl_device_registers.h"
- #include "fsl_dac_driver.h"
- #include "fsl_pit_driver.h"
- #include "board.h"
- #define BOARD_DAC_INSTANCE 0
- #define BOARD_PIT_INSTANCE 0
- volatile bool pitIsrFlag = false;
- extern const uint16_t sin_wave[];
- int main(void)
- {
- /* Write your code here */
- dac_converter_config_t dacUserConfig;
-
- uint32_t i;
- pit_user_config_t chn0Confg = {
- .isInterruptEnabled = true,
- .periodUs = 100u
- };
- hardware_init();
- DAC_DRV_StructInitUserConfigNormal(&dacUserConfig);
- DAC_DRV_Init(BOARD_DAC_INSTANCE, &dacUserConfig);
- PIT_DRV_Init(BOARD_PIT_INSTANCE, false);
- PIT_DRV_InitChannel(BOARD_PIT_INSTANCE, 0, &chn0Confg);
- PIT_DRV_StartTimer(BOARD_PIT_INSTANCE, 0);
- /* This for loop should be replaced. By default this loop allows a single stepping. */
- for (;;) {
- for (i = 0; i < 360; i++) {
- while (false == pitIsrFlag) {
- ;
- }
- pitIsrFlag = false;
- DAC_DRV_Output(BOARD_DAC_INSTANCE, sin_wave[i]);
- }
- }
- /* Never leave main */
- return 0;
- }
- ////////////////////////////////////////////////////////////////////////////////
- // EOF
- ////////////////////////////////////////////////////////////////////////////////
复制代码
PIT中断程序:
- #include <stdlib.h>
- #include <assert.h>
- #include "fsl_pit_driver.h"
- /*******************************************************************************
- * Variables
- ******************************************************************************/
- extern volatile bool pitIsrFlag;
- /*******************************************************************************
- * Code
- ******************************************************************************/
- /*!
- * @brief System default IRQ handler defined in startup code.
- */
- void PIT_IRQHandler(void)
- {
- if (PIT_HAL_IsIntPending(g_pitBase[0], 0)) {
- /* Clear interrupt flag.*/
- PIT_HAL_ClearIntFlag(g_pitBase[0], 0);
- pitIsrFlag = true;
- }
- }
- /*! @} */
- /*******************************************************************************
- * EOF
- ******************************************************************************/
复制代码
正弦波数据程序:
- #include "stdint-gcc.h"
- const uint16_t sin_wave[360] = {
- 0x0800, 0x0823, 0x0847, 0x086B, 0x088E, 0x08B2, 0x08D6, 0x08F9,
- 0x091C, 0x0940, 0x0963, 0x0986, 0x09A9, 0x09CC, 0x09EF, 0x0A11,
- 0x0A34, 0x0A56, 0x0A78, 0x0A9A, 0x0ABC, 0x0ADD, 0x0AFF, 0x0B20,
- 0x0B40, 0x0B61, 0x0B81, 0x0BA1, 0x0BC1, 0x0BE0, 0x0BFF, 0x0C1E,
- 0x0C3D, 0x0C5B, 0x0C78, 0x0C96, 0x0CB3, 0x0CD0, 0x0CEC, 0x0D08,
- 0x0D24, 0x0D3F, 0x0D5A, 0x0D74, 0x0D8E, 0x0DA7, 0x0DC0, 0x0DD9,
- 0x0DF1, 0x0E09, 0x0E20, 0x0E37, 0x0E4D, 0x0E63, 0x0E78, 0x0E8D,
- 0x0EA1, 0x0EB5, 0x0EC8, 0x0EDB, 0x0EED, 0x0EFE, 0x0F0F, 0x0F20,
- 0x0F30, 0x0F3F, 0x0F4E, 0x0F5C, 0x0F6A, 0x0F77, 0x0F84, 0x0F8F,
- 0x0F9B, 0x0FA6, 0x0FB0, 0x0FB9, 0x0FC2, 0x0FCB, 0x0FD2, 0x0FD9,
- 0x0FE0, 0x0FE6, 0x0FEB, 0x0FF0, 0x0FF4, 0x0FF7, 0x0FFA, 0x0FFC,
- 0x0FFE, 0x0FFF, 0x0FFF, 0x0FFF, 0x0FFE, 0x0FFC, 0x0FFA, 0x0FF7,
- 0x0FF4, 0x0FF0, 0x0FEB, 0x0FE6, 0x0FE0, 0x0FD9, 0x0FD2, 0x0FCB,
- 0x0FC2, 0x0FB9, 0x0FB0, 0x0FA6, 0x0F9B, 0x0F8F, 0x0F84, 0x0F77,
- 0x0F6A, 0x0F5C, 0x0F4E, 0x0F3F, 0x0F30, 0x0F20, 0x0F0F, 0x0EFE,
- 0x0EED, 0x0EDB, 0x0EC8, 0x0EB5, 0x0EA1, 0x0E8D, 0x0E78, 0x0E63,
- 0x0E4D, 0x0E37, 0x0E20, 0x0E09, 0x0DF1, 0x0DD9, 0x0DC0, 0x0DA7,
- 0x0D8E, 0x0D74, 0x0D5A, 0x0D3F, 0x0D24, 0x0D08, 0x0CEC, 0x0CD0,
- 0x0CB3, 0x0C96, 0x0C78, 0x0C5B, 0x0C3D, 0x0C1E, 0x0BFF, 0x0BE0,
- 0x0BC1, 0x0BA1, 0x0B81, 0x0B61, 0x0B40, 0x0B20, 0x0AFF, 0x0ADD,
- 0x0ABC, 0x0A9A, 0x0A78, 0x0A56, 0x0A34, 0x0A11, 0x09EF, 0x09CC,
- 0x09A9, 0x0986, 0x0963, 0x0940, 0x091C, 0x08F9, 0x08D6, 0x08B2,
- 0x088E, 0x086B, 0x0847, 0x0823, 0x0800, 0x07DC, 0x07B8, 0x0794,
- 0x0771, 0x074D, 0x0729, 0x0706, 0x06E3, 0x06BF, 0x069C, 0x0679,
- 0x0656, 0x0633, 0x0610, 0x05EE, 0x05CB, 0x05A9, 0x0587, 0x0565,
- 0x0543, 0x0522, 0x0500, 0x04DF, 0x04BF, 0x049E, 0x047E, 0x045E,
- 0x043E, 0x041F, 0x0400, 0x03E1, 0x03C2, 0x03A4, 0x0387, 0x0369,
- 0x034C, 0x032F, 0x0313, 0x02F7, 0x02DB, 0x02C0, 0x02A5, 0x028B,
- 0x0271, 0x0258, 0x023F, 0x0226, 0x020E, 0x01F6, 0x01DF, 0x01C8,
- 0x01B2, 0x019C, 0x0187, 0x0172, 0x015E, 0x014A, 0x0137, 0x0124,
- 0x0112, 0x0101, 0x00F0, 0x00DF, 0x00CF, 0x00C0, 0x00B1, 0x00A3,
- 0x0095, 0x0088, 0x007B, 0x0070, 0x0064, 0x0059, 0x004F, 0x0046,
- 0x003D, 0x0034, 0x002D, 0x0026, 0x001F, 0x0019, 0x0014, 0x000F,
- 0x000B, 0x0008, 0x0005, 0x0003, 0x0001, 0x0000, 0x0000, 0x0000,
- 0x0001, 0x0003, 0x0005, 0x0008, 0x000B, 0x000F, 0x0014, 0x0019,
- 0x001F, 0x0026, 0x002D, 0x0034, 0x003D, 0x0046, 0x004F, 0x0059,
- 0x0064, 0x0070, 0x007B, 0x0088, 0x0095, 0x00A3, 0x00B1, 0x00C0,
- 0x00CF, 0x00DF, 0x00F0, 0x0101, 0x0112, 0x0124, 0x0137, 0x014A,
- 0x015E, 0x0172, 0x0187, 0x019C, 0x01B2, 0x01C8, 0x01DF, 0x01F6,
- 0x020E, 0x0226, 0x023F, 0x0258, 0x0271, 0x028B, 0x02A5, 0x02C0,
- 0x02DB, 0x02F7, 0x0313, 0x032F, 0x034C, 0x0369, 0x0387, 0x03A4,
- 0x03C2, 0x03E1, 0x0400, 0x041F, 0x043E, 0x045E, 0x047E, 0x049E,
- 0x04BF, 0x04DF, 0x0500, 0x0522, 0x0543, 0x0565, 0x0587, 0x05A9,
- 0x05CB, 0x05EE, 0x0610, 0x0633, 0x0656, 0x0679, 0x069C, 0x06BF,
- 0x06E3, 0x0706, 0x0729, 0x074D, 0x0771, 0x0794, 0x07B8, 0x07DC
- };
复制代码
三、感想与收获:
1、DAC的基本功能有所了解,也有一些问题有待解决。
|