OpenEdv-开源电子网

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

【请教】DAC的触发方式

[复制链接]

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2014-12-30
在线时间
14 小时
发表于 2016-4-20 16:20:15 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 凌煜 于 2016-4-20 16:21 编辑

      基于STM32F10x,通过ADC采集,数据处理后,通过DAC输出,ADC和DAC都采用DMA方式搬运。           现在考虑的是,在ADC搬运完一段数据后,需要对这段数据进行处理,然后再开启DAC的搬运,否则DAC搬运的数据就是错误数据(这样理解对吗?)
      看了些教程,觉得应该是通过控制DAC的触发来控制DAC搬运,但是DAC的触发好像只能选择TIM6(软件触发和外部触发好像不太符合),可是这段数据的处理时间是未定的,那通过定时器触发定时周期也没法选择,所以想请教下,在这种情况下,应该怎么控制DAC的搬运?

最佳答案

查看完整内容[请看2#楼]

我来分享一个, 这辈子其实也就做了这一个 项目概况: F4控制一个DA,以输出设定的波形; 该波形加在负载上,负载另一端有信号输出; F4同时控制一个AD,对负载的输出信号同步进行采集。 DA和AD都是SPI接口,是有意选择的。 (数据的处理是另一回事,无关了) 设计的流程: 定时器产生PWM波形,作为DA的数据锁存信号,同时作为AD器件的硬件触发信号以启动转换; 该PWM的匹配成功信号,在F4内部触发DMA,向SPI ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11551
金钱
11551
注册时间
2014-4-1
在线时间
1316 小时
发表于 2016-4-20 16:20:16 | 显示全部楼层
本帖最后由 xuande 于 2016-4-21 22:14 编辑

我来分享一个,
这辈子其实也就做了这一个  

项目概况:
F4控制一个DA,以输出设定的波形;
该波形加在负载上,负载另一端有信号输出;
F4同时控制一个AD,对负载的输出信号同步进行采集。
DA和AD都是SPI接口,是有意选择的。
(数据的处理是另一回事,无关了)

设计的流程:
定时器产生PWM波形,作为DA的数据锁存信号,同时作为AD器件的硬件触发信号以启动转换;
该PWM的匹配成功信号,在F4内部触发DMA,向SPI发送数据;
向SPI发送数据这个动作,一方面把预设的波形送到DA器件,同时从AD器件读取数据;
该“SPI接收成功”这个事件,再次触发另一路DMA,把接收到的AD数据送到规定的存储区域。

以上过程构成流水线、循环运转,一直到设定的DMA的number完成,此时完成比如一个周期的DA输出及AD采集;
然后再次启动。。。

回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-4-20 16:31:52 | 显示全部楼层
处理完成之后再开DMA  不就可以了
回复

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2014-12-30
在线时间
14 小时
 楼主| 发表于 2016-4-20 16:45:08 | 显示全部楼层
止天 发表于 2016-4-20 16:31
处理完成之后再开DMA  不就可以了

那这样DAC是不是不需要外部触发了?
控制DMA的开启时通过DMA_Cmd()函数吗?
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-4-21 07:40:44 | 显示全部楼层
dma直接就触发了DAC
回复

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2014-12-30
在线时间
14 小时
 楼主| 发表于 2016-4-21 09:30:38 | 显示全部楼层
本帖最后由 凌煜 于 2016-4-21 09:35 编辑
止天 发表于 2016-4-21 07:40
dma直接就触发了DAC

   你好!
   不知道为什么设置DAC为T6_TRGO 触发,感觉能读出数据,但是设置为无触发,DAC的输出数据都为零。  感觉这应该是不合理的,但是不知道为什么,下面是部分代码,能帮忙看下,大概哪里出问题了吗?        
void GPIO_Config(void)
{
        GPIO_InitTypeDef                                                                        GPIO_InitStructure;
        
        GPIO_InitStructure.GPIO_Pin                        = GPIO_Pin_4 ;                                                                     
        GPIO_InitStructure.GPIO_Mode                = GPIO_Mode_AIN;                                                           
        GPIO_Init(GPIOA, &GPIO_InitStructure);
}



void DAC_Config(void)
{
        DAC_InitTypeDef                                        DAC_InitStructure;
        DMA_InitTypeDef                                        DMA_InitStructure;
        
        DAC_InitStructure.DAC_Trigger                                                               = DAC_Trigger_None;                                                
        DAC_InitStructure.DAC_WaveGeneration                                                   = DAC_WaveGeneration_None;                                
        DAC_InitStructure.DAC_OutputBuffer                                                        = DAC_OutputBuffer_Disable;                                      
        DAC_Init(DAC_Channel_1, &DAC_InitStructure);
      
        
        DMA_InitStructure.DMA_PeripheralBaseAddr                        = DAC_DHR12RD_Address;                                       
        DMA_InitStructure.DMA_MemoryBaseAddr                           = (u32) &(DAC_Input);               
        DMA_InitStructure.DMA_DIR                                             = DMA_DIR_PeripheralDST;                             
        DMA_InitStructure.DMA_BufferSize                                     = samples;               
        DMA_InitStructure.DMA_DIR                                             = DMA_DIR_PeripheralDST;                              
        DMA_InitStructure.DMA_PeripheralInc                                 = DMA_PeripheralInc_Disable;               
        DMA_InitStructure.DMA_MemoryInc                                   = DMA_MemoryInc_Enable;                                   
        DMA_InitStructure.DMA_PeripheralDataSize                        = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStructure.DMA_MemoryDataSize                             = DMA_MemoryDataSize_HalfWord;               
        DMA_InitStructure.DMA_Mode                                             = DMA_Mode_Circular;                                                
        DMA_InitStructure.DMA_Priority                                           = DMA_Priority_High;
        DMA_InitStructure.DMA_M2M                                             = DMA_M2M_Disable;                                          
        
        DMA_Init(DMA2_Channel3, &DMA_InitStructure);                                                                                                                    
        DMA_Cmd(DMA2_Channel3, ENABLE);


        DAC_Cmd(DAC_Channel_1, ENABLE);
        DAC_DMACmd(DAC_Channel_1, ENABLE);
        
}


void DAC_DMA_Config(void)
{
        GPIO_Config();
        DAC_Config();
}
main:
while(1)
        {
               
                if(DMA_GetFlagStatus(DMA1_FLAG_TC1) == SET)
                {
                        
                for(i = 0; i < samples; i++)
                {
                        ADC_ConvertedValueLocal                = (float) ADC_ConvertedValue        /        4096 * 3.3;
    printf("\r\n CH1_PC1 value[%d] = %f V\r\n", i, ADC_ConvertedValueLocal);
                }               
               
                for(i = 0; i < samples; i++)
                {
                        DAC_Input = ADC_ConvertedValue;
                        DAC_Value = (float) DAC_GetDataOutputValue(DAC_Channel_1) / 4095 * 3.3;
                        printf("\r\n DAC value[%d] = %f V \r\n",i, DAC_Value);
                }
                        
                }
                DMA_ClearFlag(DMA1_FLAG_TC1);
               
               
                Delay(0xffffee);
               
        }                  
输出结果:
QQ截图20160421093000.png
回复

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2014-12-30
在线时间
14 小时
 楼主| 发表于 2016-4-21 16:10:19 | 显示全部楼层
好吧,问题依旧没有解决……
现在发现一个问题,个人理解是DAC如果设置成无触发,只能通过DAC_SetChannel1Data(DAC_Align_12b_R,4000);发送数据,但是觉得这种方法应该不对,感觉这样DMA就显得很多余……
所以感觉应该还是需要TIM触发,那么问题来了,TIM如何保证在数据都处理完了后,才触发DAC呢?
接下来应该是解决这个问题了……感觉还是对STM32不太懂,走了好多弯路……等找到解决方案,再来结贴……^_^
回复

使用道具 举报

28

主题

303

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2014-8-14
在线时间
67 小时
发表于 2016-4-21 21:04:35 | 显示全部楼层
mark,坐等大神分享经验。
这个世界上还有很多很多的人,但你不认识他们,他们也不属于你的世界。这个世界上还有很多好吃的好玩的好看的东西,可真正属于你的世界其实是很小的,只是你去过的地方吃过的东西和见过的落日,还有会在乎你死活的朋友。”——《龙族》
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11551
金钱
11551
注册时间
2014-4-1
在线时间
1316 小时
发表于 2016-4-21 21:56:45 | 显示全部楼层

关键是这段处理过程太模糊,有“为用而用”的嫌疑。

回复

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2014-12-30
在线时间
14 小时
 楼主| 发表于 2016-4-25 14:12:47 | 显示全部楼层
胡乱折腾了两天,今天用示波器测试了下,虽然有了个初步的结果,但是还是存在很多的问题。
ADC和DAC都用TIM触发,用信号源输入信号能在DAC测到输出,但波形在峰值地方噪声较大,感觉还是对ADC和DAC的工作原理不够清楚,总之慢慢修炼,此贴就这样先结吧。
然后要纠正一个错误:DAC不仅能用TIM6触发,还有TIM2,TIM4,TIM5,TIN3,TIM7,是之前用的STM32参考手册可能在翻译过程中出错了。
回复

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2014-12-30
在线时间
14 小时
 楼主| 发表于 2016-4-25 14:13:24 | 显示全部楼层
xuande 发表于 2016-4-20 16:20
我来分享一个,
这辈子其实也就做了这一个  

谢谢分享……^_^
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 16:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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