OpenEdv-开源电子网

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

用DMA的DAC 正弦波发生 问题

[复制链接]

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2016-6-6
在线时间
16 小时
发表于 2016-10-28 16:21:50 | 显示全部楼层 |阅读模式
5金钱
我想程序运行就不断产生正弦波,之前用的        DAC_SetChannel1Data(DAC_Align_12b_R, adcx); 但是 用示波器显示不出波形,lcd上显示好好的。后来想是不是必须用DMA的事,但搞了好久,只有当时钟触发的时候才有显示,但 我想能不能不用时钟,或者改用软件 或者不用。 int main(void)

{       
         u8 dacval;               
          u8 hun=0, m;
        u16 i=0,PA4=0,PA5=0,New = 0 , adcx = 0,k = 0;
        u16 ksinv=1,ksinvi=0;//按键user2参数
        delay_init();                     //延时函数初始化          
        LCD_Init();                //LCD初始化
        KEY_Init();
        LED_Init();
        DAC_DMA_Config();
        Init_All_Periph();//所有初始化 包括DAC
        LCD_Clear(RED);       
        LCD_DrawLine(120,0,120,320);
        LCD_DrawLine(0,160,240,160);


while(1)
       
{         

        if(1)//按键处理 这里可以不看
        {
            if(hun<5) //减慢读点速度
           {
                if (KEY_Scan(1))
                {        LED0=!LED0;
                        hun++;
                        LCD_ShowString(60,100,200,16,16,"spend:");
                        LCD_ShowxNum(140,100,hun,5,16,0X80);
                }
            }
        else{hun=0;}
        for( m=0;m<hun;m++)
        {delay_ms(20);
        }
        LED1=0;//判断灯 按键好使
        else ksinvi=0;

        if(i < 1024) i+=2;
        else i = 0;
                if(KEY2 == 0)
        {
                LCD_Fast_DrawPoint(k,PA5,YELLOW);
                USART_SendData(USART1, PA5);
        }
        else
        {
        USART_SendData(USART1, PA4);
        }

        LCD_Fast_DrawPoint(k,PA4,BLUE);

        if(k < 240)
        {       
                k++;
                LCD_ShowString(60,150,200,16,16,"PA4 DAC VOL:");       
                LCD_ShowxNum(140,150,PA4,5,16,0X80);
        }
        else  //画图后到头了就清屏
        {        k=0;
                LCD_Clear(RED);       
                LCD_DrawLine(120,0,120,320);
                LCD_DrawLine(0,160,240,160);             
                LCD_ShowString(60,170,200,16,16,"PA4 DAC VOL:");             
                LCD_ShowString(60,190,200,16,16,"PA0 ADC VOL:");
                LCD_ShowString(60,210,200,16,16,"PA5 DAC2 VOL:");
                LCD_ShowString(60,230,200,16,16,"SIN  VOL:");
               
        }
       
        LCD_ShowxNum(140,170,PA4,5,16,0X80);
        LCD_ShowxNum(140,190,adcx,5,16,0X80);
        LCD_ShowxNum(140,210,PA5,5,16,0X80);
        LCD_ShowxNum(140,230,dacval,5,16,0X80);
       
}
//这里才是转换关键
        dacval=Sine_WAVE[i];

        //DAC_SetChannel1Data(DAC_Align_12b_R, dacval);


        PA4 = DAC_GetDataOutputValue(DAC_Channel_1); //用这个读取传输过程的电压值显示,但是没结果啊
/*ADC的值**********************************************************/

        adcx=Get_Adc(ADC_Channel_0);                //得到ADC转换值           A0
        DAC_SetChannel2Data(DAC_Align_12b_R, adcx);
        PA5=DAC_GetDataOutputValue(DAC_Channel_2);        //得到DA转换   PA4       

       
/*******************************************************/

}                  
}

void DAC_DMA_Config(void)
{
        DMA_InitTypeDef  DMA_InitStructure;
       
        /* 使能DMA2时钟 */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
       
        /* 配置DMA2 */
        DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1_Address;                                        //外设数据地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine_WAVE;                                //内存数据地址 Sine_WAVE
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                                                                //数据传输方向内存至外设
        DMA_InitStructure.DMA_BufferSize = 1024;                                                                                        //缓存大小为32字节       
        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_Channel3, &DMA_InitStructure);
       

        DMA_Cmd(DMA2_Channel3, ENABLE);
}

void DAC_Config(void)
{
            GPIO_InitTypeDef GPIO_InitStructure;
            DAC_InitTypeDef DAC_InitStructure;
       
            DAC_DeInit();
       
            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_Init(GPIOA, &GPIO_InitStructure);
         
                                    
            DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software;  //DAC_Trigger_T2_TRGO;//      //Software
            DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;//不使用波形发生
            DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置
            //DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable ;        //DAC1输出缓存关闭 BOFF1=1
            DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable ;        //DAC1输出缓存打开,提高端口驱动能力 BOFF1=0
            DAC_Init(DAC_Channel_1, &DAC_InitStructure);           //初始化DAC通道1
                        DAC_Init(DAC_Channel_2, &DAC_InitStructure);
            DAC_Cmd(DAC_Channel_1, ENABLE);                        //使能DAC1       
                        DAC_Cmd(DAC_Channel_2, ENABLE);                        //使能DAC2       
            DAC_SetChannel1Data(DAC_Align_12b_R, 0);            //12位右对齐数据格式设置DAC值
                        DAC_SetChannel2Data(DAC_Align_12b_R, 0);            //12位右对齐数据格式设置DAC值
                        DAC_DMACmd(DAC_Channel_1, ENABLE);
                        DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);
}

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 12:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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