打印

stm32 dac的转换能力是多大啊??

[复制链接]
12200|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
love001cool|  楼主 | 2012-6-7 18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32 dac的转换能力是多大啊??

怎么算呢?
沙发
梅花望青竹| | 2012-6-7 21:41 | 只看该作者
没有听明白的,楼主说更详细一点吧!

使用特权

评论回复
板凳
IJK| | 2012-6-8 09:38 | 只看该作者
如LS所说,LZ问题没听明白。

如果说问分辨率,那么stm32 dac是12位。
如果想问驱动能力,那么stm32 dac 输出有2种方式,输出buffer打开 或者关闭【各有优缺点】。输出buffer打开时,驱动能力比较强,印象驱动 1k电阻应该没有问题。

使用特权

评论回复
地板
清风致影| | 2012-6-8 12:14 | 只看该作者
问什么?电压范围 分辨率 速度?

使用特权

评论回复
5
love001cool|  楼主 | 2012-6-8 16:02 | 只看该作者
就是转换速率啊!!!

使用特权

评论回复
6
love001cool|  楼主 | 2012-6-9 13:40 | 只看该作者
ADC转换速度1MS/s表示什么意思呢??
转换是一直在转换还是表示他有这么大的转换能力呢??

使用特权

评论回复
7
王紫豪| | 2012-6-9 13:45 | 只看该作者
转换不转换, 是人控制的

使用特权

评论回复
8
love001cool|  楼主 | 2012-6-9 13:52 | 只看该作者
转换不转换, 是人控制的
王紫豪 发表于 2012-6-9 13:45



就是说发一次数据转换一次,不发了就不转换了吗?

使用特权

评论回复
9
love001cool|  楼主 | 2012-6-11 10:09 | 只看该作者
没有听明白的,楼主说更详细一点吧!
梅花望青竹 发表于 2012-6-7 21:41



dac的转换速率是1MS/s,如果是12位的,那就是说1秒可以转换8×12×1=96Mbps吗?

使用特权

评论回复
10
lai832| | 2012-6-11 10:49 | 只看该作者

STM32F103VET的DA更新速度多高?

本帖最后由 lai832 于 2012-6-11 11:20 编辑

也不熟,因为现在我也在弄这个,有少少问题:

150uS更新一次数据,输出三角波,输出偏移量就是我设置的值.
-----忘了说:三角波周期750mS;偏移值(更新值)是三角波的尖.最大值时转最小值,最小值时转最大值(懒画图)
--------慢慢更新,输出正常-----是要求值的电平

从波形上看,有点像:缓存没输出完,又更新了.在试最高速度中.
最高是1M/s吗???
----------------------还在搜索资料中,,,,反正有同类型的贴,顺便问一下...:)

1M/S,找到贴了:https://bbs.21ic.com/viewthread.php?tid=111217&;highlight=STM32%2BDAC

粘连接有问题,站内搜:为什么STM32的DAC没有介绍转换时间长度是多少?

使用特权

评论回复
11
lai832| | 2012-6-11 12:42 | 只看该作者

..

本帖最后由 lai832 于 2012-6-11 12:49 编辑

确认与更新无关.
读寄存器,数据自加/减,可能是不知那出问题,变成三角波模式了,查中...
谁有遇到过?


main()里的
while(1)前初值,并在while(1)内无更新,输出正常
或在while通过键盘更新----while会一直更新设置值,也正常

如果在while(1)内给寄存器赋值,并更新.
----赋值与更新是直接CPOY初始化语句----用的是库---定值2047;
就出问题了

使用特权

评论回复
12
lai832| | 2012-6-11 12:59 | 只看该作者

..

本帖最后由 lai832 于 2012-6-11 13:08 编辑

while(1)
  {
/*    Times_Out(0x30);
    while(Time_Out_Flag)
    {
      LED_Main();   
      Times_Out(0);
    }*/
    LED_Main();
  
    Head_Main();

//    if (x > 10)        //加这个,改变更新速度,结果波形的频率变了,,,更新快,频率高
//    {
      DA_Main();
//      x = 0;
      Head_Data[2] = DAC_GetDataOutputValue(DAC_Channel_1);;
//    }
//    x++;
   
/*    if (x == 0)
    {
      if (y == 100000)
        x = 1;
      else
        y++;
    } else
    {
      if (y == -100000)
        x = 0;
      else
        y--;
    }
    Head_Data[0] = y / 10;*/
   
  }

void DA_Main(void)
{
  DA_Data();
  DA_Update_Out();
}

注:DA_Data();有点复杂,
在DA_Update_Out()里直接输出固定值了..

void DA_Update_Out(void)
{
//  DAC_SetDualChannelData(DAC_Align_12b_R, DA_Buffer[1],DA_Buffer[0]);
  DAC_SetDualChannelData(DAC_Align_12b_R, 2047,2047);
  //?????ÒªÑÓʱ·ñ????????????????????????????????????????????????????????????????????
  DAC_DualSoftwareTriggerCmd(ENABLE);
  //SPI¸üÐÂ
//  DA_SPI_Send();
}


这是DA初始化:
void DA_ST_Init(void)
{
  DA_RCC_Conf();
  DA_GPIO_Conf();
  DAC_InitTypeDef  DAC_InitStructure;
//  DA_Time_Conf();
  //DAC Configuration
  DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software;        /////DAC_Trigger_T2_TRGO;
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; //ÎÞ
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
//DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits11_0;  
  //DAC channel1 Configuration
  DAC_Init(DAC_Channel_1, &DAC_InitStructure);  //³õʼ»¯
  //DAC channel2 Configuration
  DAC_Init(DAC_Channel_2, &DAC_InitStructure);
  // Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is
  //   automatically connected to the DAC converter.
  DAC_Cmd(DAC_Channel_1, ENABLE);
  // Enable DAC Channel2: Once the DAC channel2 is enabled, PA.05 is
  //   automatically connected to the DAC converter.
  DAC_Cmd(DAC_Channel_2, ENABLE);
/****************************看这下面的  *******************************/
  // ÉèÖÃÊý¾Ý,Set DAC dual channel DHR12RD register
  DAC_SetDualChannelData(DAC_Align_12b_R, 2047 , 2047);
//  DAC_SetDualChannelData(DAC_Align_12b_R, DA1_Calib[2] , DA0_Calib[2]);  //ÓÒ¶ÔÆë,DA2,DA1Öµ,Êä³ö°ëÖµ
  DAC_DualSoftwareTriggerCmd(ENABLE);//ʹÄÜÈí¼þ´¥·¢,¸üÐÂDACµÄÖµÒ»´Î
}

使用特权

评论回复
13
lai832| | 2012-6-11 14:11 | 只看该作者

..

本帖最后由 lai832 于 2012-6-11 14:12 编辑

进程:
看下面的简单点:
  DAC_SetDualChannelData(DAC_Align_12b_R, 2047,2047);
  //?????ÒªÑÓʱ·ñ????????????????????????????????????????????????????????????????????
  DAC_DualSoftwareTriggerCmd(ENABLE);
  while(1)
  {
/*    Times_Out(0x30);
    while(Time_Out_Flag)
    {
      LED_Main();   
      Times_Out(0);
    }*/
    LED_Main();
  
//    Head_Main();
  DAC_SetDualChannelData(DAC_Align_12b_R, 2047,2047);
  //?????ÒªÑÓʱ·ñ????????????????????????????????????????????????????????????????????
  DAC_DualSoftwareTriggerCmd(ENABLE);
//    DA_Main();
  Head_Data[2] = DAC_GetDataOutputValue(DAC_Channel_1);
  }


问题有点怪,我也想不明了:
不管在哪更新DA
只要不断电,拉低复位脚复位....输出正常

如果断电再上电,
如上面程序.
就输出三角波:输出值是偏移值,当输出值=偏移值时:值由自加变自减.或由自减变自加,并且输出最大时转最小,最小时转最大

如果在循环内不更新,输出不变.
禁用循环内的:
  DAC_SetDualChannelData(DAC_Align_12b_R, 2047,2047);
  //?????ÒªÑÓʱ·ñ????????????????????????????????????????????????????????????????????
  DAC_DualSoftwareTriggerCmd(ENABLE);




如果循环内更新DA,并且断电重新上电,就输出三角波(波形如上面描述).
但是不断电,从复位脚复位,正常


-----------头痛中.
另:库函数
#define DAC_Align_12b_R                    ((uint32_t)0x00000000)
#define DAC_Align_12b_L                    ((uint32_t)0x00000004)
#define DAC_Align_8b_R                     ((uint32_t)0x00000008)
/**
  * @brief  Set the specified data holding register value for dual channel
  *   DAC.  //ÉèÖÃ˫ͨµÀ¶ÔÆë±£³Ö¼Ä´æÆ÷
  * @param  DAC_Align: Specifies the data alignment for dual channel DAC.
  *   This parameter can be one of the following values:
  *     @arg DAC_Align_8b_R: 8bit right data alignment selected
  *     @arg DAC_Align_12b_L: 12bit left data alignment selected
  *     @arg DAC_Align_12b_R: 12bit right data alignment selected
//ÈýÖÖ¶ÔÆëģʽ
  * @param  Data2: Data for DAC Channel2 to be loaded in the selected data
  *   holding register.
//DAC2Êý¾Ý
  * @param  Data1: Data for DAC Channel1 to be loaded in the selected data
  *   holding register.
//DAC1Êý¾Ý
  * @retval None
  */
void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1)
{
  uint32_t data = 0, tmp = 0;
  
  /* Check the parameters */
//832    assert_param(IS_DAC_ALIGN(DAC_Align));
//832    assert_param(IS_DAC_DATA(Data1));
//832    assert_param(IS_DAC_DATA(Data2));
  
  /* Calculate and set dual DAC data holding register value */
  if (DAC_Align == DAC_Align_8b_R)
  {
    data = ((uint32_t)Data2 << 8) | Data1;
  }
  else
  {
    data = ((uint32_t)Data2 << 16) | Data1;
  }
  
  tmp = (uint32_t)DAC_BASE;
  tmp += DHR12RD_OFFSET + DAC_Align;

  /* Set the dual DAC selected data holding register */
  *(__IO uint32_t *)tmp = data;
}

好像没有左/右对齐处理

使用特权

评论回复
14
lai832| | 2012-6-11 15:43 | 只看该作者

搞定了

本帖最后由 lai832 于 2012-6-11 15:46 编辑

//DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits11_0;  
使用这条,并设置为DAC_LFSRUnmask_Bits0

偷懒就是不行.

对了,上面的库函数没问题,是选择不同的寄存器的,只是数据要自行移位.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

19

帖子

0

粉丝