OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3846|回复: 2

双路DAC+DMA,PA4电压不正常,PA5电压正常

[复制链接]

1

主题

15

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-8-31
在线时间
6 小时
发表于 2021-10-10 14:48:11 | 显示全部楼层 |阅读模式
20金钱
希望大神能找一下原因


#include "dac.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//DAC 代码          
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/8
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////
/*
//正弦波单个周期的点数
#define POINT_NUM 32

//波形数据 ---------------------------------------------------------
const uint16_t Sine12bit[POINT_NUM] = {
        2048        , 2460        , 2856        , 3218        , 3532        , 3786        , 3969        , 4072        ,
        4093        , 4031        , 3887        , 3668        , 3382        , 3042        ,        2661        , 2255        ,
        1841        , 1435        , 1054        , 714                , 428                , 209                , 65                , 3                        ,
        24                , 127                , 310                , 564                , 878                , 1240        , 1636        , 2048
};
*/


//正弦波单个周期的点数
#define POINT_NUM 256

//波形数据 ---------------------------------------------------------
const uint16_t Sine12bit[POINT_NUM] = { 0x7FF,0x831,0x863,0x896,0x8C8,0x8FA,0x92B,0x95D,0x98E,0x9C0,0x9F1,0xA21,0xA51,0xA81,0xAB1,0xAE0
,0xB0F,0xB3D,0xB6A,0xB98,0xBC4,0xBF0,0xC1C,0xC46,0xC71,0xC9A,0xCC3,0xCEB,0xD12,0xD38,0xD5E,0xD83
,0xDA7,0xDCA,0xDEC,0xE0D,0xE2E,0xE4D,0xE6C,0xE89,0xEA5,0xEC1,0xEDB,0xEF5,0xF0D,0xF24,0xF3A,0xF4F
,0xF63,0xF75,0xF87,0xF97,0xFA6,0xFB4,0xFC1,0xFCD,0xFD7,0xFE0,0xFE8,0xFEF,0xFF5,0xFF9,0xFFC,0xFFE
,0xFFE,0xFFE,0xFFC,0xFF9,0xFF5,0xFEF,0xFE8,0xFE0,0xFD7,0xFCD,0xFC1,0xFB4,0xFA6,0xF97,0xF87,0xF75
,0xF63,0xF4F,0xF3A,0xF24,0xF0D,0xEF5,0xEDB,0xEC1,0xEA5,0xE89,0xE6C,0xE4D,0xE2E,0xE0D,0xDEC,0xDCA
,0xDA7,0xD83,0xD5E,0xD38,0xD12,0xCEB,0xCC3,0xC9A,0xC71,0xC46,0xC1C,0xBF0,0xBC4,0xB98,0xB6A,0xB3D
,0xB0F,0xAE0,0xAB1,0xA81,0xA51,0xA21,0x9F1,0x9C0,0x98E,0x95D,0x92B,0x8FA,0x8C8,0x896,0x863,0x831
,0x7FF,0x7CD,0x79B,0x768,0x736,0x704,0x6D3,0x6A1,0x670,0x63E,0x60D,0x5DD,0x5AD,0x57D,0x54D,0x51E
,0x4EF,0x4C1,0x494,0x466,0x43A,0x40E,0x3E2,0x3B8,0x38D,0x364,0x33B,0x313,0x2EC,0x2C6,0x2A0,0x27B
,0x257,0x234,0x212,0x1F1,0x1D0,0x1B1,0x192,0x175,0x159,0x13D,0x123,0x109,0x0F1,0x0DA,0x0C4,0x0AF
,0x09B,0x089,0x077,0x067,0x058,0x04A,0x03D,0x031,0x027,0x01E,0x016,0x00F,0x009,0x005,0x002,0x000
,0x000,0x000,0x002,0x005,0x009,0x00F,0x016,0x01E,0x027,0x031,0x03D,0x04A,0x058,0x067,0x077,0x089
,0x09B,0x0AF,0x0C4,0x0DA,0x0F1,0x10A,0x123,0x13D,0x159,0x175,0x192,0x1B1,0x1D0,0x1F1,0x212,0x234
,0x257,0x27B,0x2A0,0x2C6,0x2EC,0x313,0x33B,0x364,0x38D,0x3B8,0x3E2,0x40E,0x43A,0x466,0x494,0x4C1
,0x4EF,0x51E,0x54D,0x57D,0x5AD,0x5DD,0x60E,0x63E,0x670,0x6A1,0x6D3,0x704,0x736,0x768,0x79B,0x7CD};


const uint16_t Sawtooth12bit[POINT_NUM] = {0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240
        ,256,273,289,305,321,337,353,369,385,401,417,433,449,465,481,497,513,529,546,562,578,594,610,626,
        642,658,674,690,706,722,738,754,770,786,802,819,835,851,867,883,899,915,931,947,963,979,995,1011,
        1027,1043,1059,1075,1092,1108,1124,1140,1156,1172,1188,1204,1220,1236,1252,1268,1284,1300,1316,1332,
        1348,1365,1381,1397,1413,1429,1445,1461,1477,1493,1509,1525,1541,1557,1573,1589,1605,1621,1638,1654,
        1670,1686,1702,1718,1734,1750,1766,1782,1798,1814,1830,1846,1862,1878,1894,1911,1927,1943,1959,1975,
        1991,2007,2023,2039,2055,2071,2087,2103,2119,2135,2151,2167,2184,2200,2216,2232,2248,2264,2280,2296,
        2312,2328,2344,2360,2376,2392,2408,2424,2440,2457,2473,2489,2505,2521,2537,2553,2569,2585,2601,2617,
        2633,2649,2665,2681,2697,2713,2730,2746,2762,2778,2794,2810,2826,2842,2858,2874,2890,2906,2922,2938,
        2954,2970,2986,3003,3019,3035,3051,3067,3083,3099,3115,3131,3147,3163,3179,3195,3211,3227,3243,3259,
        3276,3292,3308,3324,3340,3356,3372,3388,3404,3420,3436,3452,3468,3484,3500,3516,3532,3549,3565,3581,
        3597,3613,3629,3645,3661,3677,3693,3709,3725,3741,3757,3773,3789,3805,3822,3838,3854,3870,3886,3902,
3918,3934,3950,3966,3982,3998,4014,4030,4046,4062,4078,4095};  //已用函数代替


uint32_t DualSine12bit[POINT_NUM];

//DAC通道1输出初始化
void Dac1_Init(void)
{

        GPIO_InitTypeDef GPIO_InitStructure;
        DAC_InitTypeDef DAC_InitType;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );          //使能PORTA通道时钟
           RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );          //使能DAC通道时钟

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4| GPIO_Pin_5;                                 // 端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                  //模拟输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        DAC_StructInit(&DAC_InitType);       

        //初始化DAC通道1                               
        DAC_InitType.DAC_Trigger=DAC_Trigger_T2_TRGO;        //使用触发功能 TIM2作为触发源
        DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
        DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;        //DAC1输出缓存关闭 BOFF1=1

        DAC_Init(DAC_Channel_1,&DAC_InitType);         //初始化DAC通道1
       
        //初始化DAC通道2
        DAC_InitType.DAC_Trigger=DAC_Trigger_T6_TRGO;        //使用触发功能 TIM6作为触发源
        DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
        DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;        //DAC1输出缓存关闭 BOFF1=1
       
  DAC_Init(DAC_Channel_2,&DAC_InitType);         //初始化DAC通道2
       
        DAC_Cmd(DAC_Channel_1, ENABLE);  //使能通道1 由PA4输出
       
        DAC_Cmd(DAC_Channel_2, ENABLE);  //使能通道2 由PA5输出


     /* 使能DAC的DMA请求   对 DAC1 和 2 的操作是同步的,所以只要把 DMA 与
     DAC 通道 2 关联起来即可,当使用 DMA 设置通道 2 的数据值时, 同时更新通道 1 的内容*/
     DAC_DMACmd(DAC_Channel_2, ENABLE);
}

static void DAC_TIM_Config(void)
{
       
        TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
       
        /* 使能TIM2、TIM6时钟,TIM2CLK 为72M */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
       
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

        /* TIM2基本定时器配置 */
        TIM_TimeBaseStructure.TIM_Period = (30-1);               //定时周期 20  
        TIM_TimeBaseStructure.TIM_Prescaler = 0x0;               //预分频,不分频 72M / (0+1) = 72M
        TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;    //时钟分频系数
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;          //向上计数模式
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
       
        TIM_TimeBaseStructure.TIM_Period = (80-1);               //定时周期 20  
        TIM_TimeBaseStructure.TIM_Prescaler = 0x0;               //预分频,不分频 72M / (0+1) = 72M
        TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;    //时钟分频系数
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;          //向上计数模式
       
        TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);

        /* 配置TIM2触发源 */
        TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);  //设置TIM2输出触发为更新模式
        TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);  //设置TIM6输出触发为更新模式

        /* 使能TIM2、TIM6 */
        TIM_Cmd(TIM2, ENABLE);
        TIM_Cmd(TIM6, ENABLE);

}

static void DAC_DMA_Config(void)
{       
        DMA_InitTypeDef  DMA_InitStructure;

        /* 使能DMA2时钟 */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

        /* 配置DMA2 */
        DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_ADDRESS;                                        //外设数据地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DualSine12bit ;                                //内存数据地址 DualSine12bit
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                                                                                        //数据传输方向内存至外设
        DMA_InitStructure.DMA_BufferSize = POINT_NUM;                                                                                                                                        //缓存大小为POINT_NUM字节       
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                                //外设数据地址固定       
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                                                        //内存数据地址自增
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;        //外设数据以字为单位
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;                                        //内存数据以字为单位       
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                                                                                        //循环模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                                                                        //高DMA通道优先级
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                                                                                                //非内存至内存模式       

        DMA_Init(DMA2_Channel4, &DMA_InitStructure);

        /* 使能DMA2-4通道 */
        DMA_Cmd(DMA2_Channel4, ENABLE);
}


void DAC_Mode_Init(void)
{
        uint32_t Idx = 0;  
       
  float outdata=0;
        Dac1_Init();
        DAC_TIM_Config();       
       
        /* 填充正弦波形数据,双通道右对齐*/
  for (Idx = 0; Idx < POINT_NUM; Idx++)
  {
       outdata = (Sine12bit[Idx] << 16) + (Sawtooth12bit[Idx]);
          
          
           DualSine12bit[Idx]=outdata;
  }
       
        DAC_DMA_Config();
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-8-31
在线时间
6 小时
 楼主| 发表于 2021-10-10 14:52:05 | 显示全部楼层
波形表数据理论结果正弦波电压为3.3V,但是只有PA5达到。PA4只有330mV左右
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3627
金钱
3627
注册时间
2019-8-14
在线时间
1054 小时
发表于 2021-10-11 11:35:10 | 显示全部楼层
使用例程源码试试PA4有没有正常输出3.3V电压,板子的ATK-MODULE接口不要接模块
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 17:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表