[STM32F1] 电机PWM期间怎么使用AD采样?

[复制链接]
9220|17
 楼主| lanmanck 发表于 2016-1-24 16:10 | 显示全部楼层 |阅读模式
大家知道电机是用pwm驱动的,那么我测相电流的时候肯定是pwm有效的时候才测。例如BLDC,某一刻有一项没通电,那么用adc测它的电流是没有意义的。
那么stm32的adc有个外部触发功能,其中有个tim1-cc4触发源,高手能不能说下怎么配置,或者是个什么思路正好在pwm有效的时候进行ad采样?
 楼主| lanmanck 发表于 2016-1-25 21:02 | 显示全部楼层
看来没人用过啊,悲催
huangcunxiake 发表于 2016-1-25 22:55 | 显示全部楼层
应该是配置好PWM后,你不去管他,他也可以正常工作,这个时候你就该做ADC,还是坐ADC。
598330983 发表于 2016-1-26 11:49 | 显示全部楼层
测这个没有意义的,你只需要测出来频率和波形就可以了,你用示波器看就行了。
deviceplugs 发表于 2016-1-31 15:58 | 显示全部楼层
你搜索一下,adc、dma、tim,我现在就是用timer触发adc启动转换
Dongfangyuxiao 发表于 2016-1-31 18:39 | 显示全部楼层
PWM的上升沿或下降沿触发ADC。
 楼主| lanmanck 发表于 2016-2-4 10:38 | 显示全部楼层
deviceplugs 发表于 2016-1-31 15:58
你搜索一下,adc、dma、tim,我现在就是用timer触发adc启动转换

哥们能上个初始化代码吗?十分感谢!
 楼主| lanmanck 发表于 2016-2-4 10:39 | 显示全部楼层
Dongfangyuxiao 发表于 2016-1-31 18:39
PWM的上升沿或下降沿触发ADC。

是换相有效才触发,不是每个波形都触发
shangwei4444 发表于 2016-2-4 15:07 | 显示全部楼层
5楼说的很明确了,TIM触发采样,采样结果直接用DMA存起来。初始化只要看看手册配置一下就行,一共也没有几个寄存器,直接上电看看采样数据,也不会影响别的功能。
 楼主| lanmanck 发表于 2016-2-5 10:06 | 显示全部楼层
shangwei4444 发表于 2016-2-4 15:07
5楼说的很明确了,TIM触发采样,采样结果直接用DMA存起来。初始化只要看看手册配置一下就行,一共也没有几 ...

不要说这些我也知道的事情,我要的是代!!码!!
另外,tim触发是count到头了触发还是cc的时候触发,这个有人研究过没?
 楼主| lanmanck 发表于 2016-2-5 14:06 | 显示全部楼层
我分享下吧,还有个问题:现在用的是混合注入式+规则,正常使用规则转换,在tim8的cc4做注入式触发,不知道注入式怎么用dma!!!!就是说tim触发的注入式转换不知道怎么用dma传数据出来,难道非要用注入式中断???dma1只有一个channel配置啊!:

  1. /* ------------ ADC1~ADC2 reguler channel configuration ----------------- */
  2.     ADC_InitStructure.ADC_Mode = ADC_Mode_RegInjecSimult; /* »ìºÏͬ²½¹æÔò+ͬ²½×¢Èëģʽ */
  3.     ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  4.     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; /* DISABLE */
  5.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  6.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  7.     ADC_InitStructure.ADC_NbrOfChannel = NUM_OF_REG_CHANNEL;
  8.     ADC_Init(ADC1, &ADC_InitStructure);
  9.     ADC_Init(ADC2, &ADC_InitStructure);
  10.     ADC_EXT_TRIG_ENABLE(ADC2); /* adc2¹æÔòͨµÀÍⲿ´¥·¢ */

  11.     /* Regular ChannelÉèÖòɼ¯Ë³ÐòºÍʱ¼ä.ÉèÖóÉË«adcºó,dmaÓÃ32bit´«Êä,µÍ16bitÊÇadc1ͨµÀ,¸ß16bitÊÇadc2ͨµÀ */
  12.     ADC_RegularChannelConfig(ADC1, CH5_RESERVED,          1, ADC_SampleTime_13Cycles5);//0
  13.     ADC_RegularChannelConfig(ADC1, CH6_VREF_1_65,   2, ADC_SampleTime_13Cycles5);// 2
  14.     ADC_RegularChannelConfig(ADC1, CH12_BAT_IN,         3, ADC_SampleTime_13Cycles5);// 4
  15.     ADC_RegularChannelConfig(ADC1, CH13_15VAD,           4, ADC_SampleTime_13Cycles5);//6
  16.     ADC_RegularChannelConfig(ADC1, CH14_RIGHT_BUS_CURRENT,        5, ADC_SampleTime_13Cycles5);//8
  17.         ADC_RegularChannelConfig(ADC1, CH15_LEFT_BUS_CURRENT,        6, ADC_SampleTime_13Cycles5);//10

  18.     /* Regular Channel */
  19.         ADC_RegularChannelConfig(ADC2, CH15_LEFT_BUS_CURRENT,1, ADC_SampleTime_13Cycles5);// 1
  20.         ADC_RegularChannelConfig(ADC2, CH5_RESERVED,          2, ADC_SampleTime_13Cycles5);// 3
  21.     ADC_RegularChannelConfig(ADC2, CH6_VREF_1_65,   3, ADC_SampleTime_13Cycles5);//5
  22.     ADC_RegularChannelConfig(ADC2, CH12_BAT_IN,         4, ADC_SampleTime_13Cycles5);//7
  23.     ADC_RegularChannelConfig(ADC2, CH13_15VAD,           5, ADC_SampleTime_13Cycles5);//9
  24.         ADC_RegularChannelConfig(ADC2, CH14_RIGHT_BUS_CURRENT,6, ADC_SampleTime_13Cycles5);//11

  25.         /* ÔÙ´ÎÅäÖÃadc1ºÍadc2µÄ×¢Èëת»»¹æÔò.Èç¹ûת»»Ìõ¼þΪTIM8CC4,Ôòµ±cc4²úÉúʱ,adc1
  26.          * ½«´¥·¢,¶øadc2»á±»×÷ΪslaveÆô¶¯×ª»».ÕâÀïµÄͨµÀ¿ÉÒÔÓÃÀ´²âÁ¿ÏàµçÁ÷.
  27.          */
  28.     /* Injected Channel×¢ÈëͨµÀ×î¶à4¸ö,²Î¿¼jsqr¼Ä´æÆ÷ */
  29.     ADC_InjectedSequencerLengthConfig(ADC1, NUM_OF_INJ_CHANNEL);

  30.     ADC_InjectedChannelConfig(ADC1, CH3_RESERVED, 1, ADC_SampleTime_13Cycles5);
  31.     ADC_InjectedChannelConfig(ADC1, CH4_RESERVED, 2, ADC_SampleTime_13Cycles5);
  32.         ADC_InjectedChannelConfig(ADC1, CH10_RESERVED, 3, ADC_SampleTime_13Cycles5);
  33.     ADC_InjectedChannelConfig(ADC1, CH11_RESERVED, 4, ADC_SampleTime_13Cycles5);

  34.     ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4);
  35.     ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE);

  36.         /* ---------------------- ADC2 configuration ------------------------------- */
  37.     /* Injected Channel */
  38.     ADC_InjectedSequencerLengthConfig(ADC2, NUM_OF_INJ_CHANNEL);

  39.     ADC_InjectedChannelConfig(ADC2, CH11_RESERVED, 1, ADC_SampleTime_13Cycles5);
  40.     ADC_InjectedChannelConfig(ADC2, CH10_RESERVED, 2, ADC_SampleTime_13Cycles5);
  41.         ADC_InjectedChannelConfig(ADC2, CH4_RESERVED, 3, ADC_SampleTime_13Cycles5);
  42.     ADC_InjectedChannelConfig(ADC2, CH3_RESERVED, 4, ADC_SampleTime_13Cycles5);

  43.     ADC_ExternalTrigInjectedConvConfig(ADC2, ADC_ExternalTrigInjecConv_None);  //GDоƬÐè¼ÓÕâ¾ä»°£¬STÄܼæÈÝ

  44.     ADC_ExternalTrigInjectedConvCmd(ADC2, ENABLE);

  45.         /* ------------------------------------------------------------------------- */

  46.     /**
  47.      * ADC1
  48.      */
  49.     /* Enable ADC1 DMA */
  50.     ADC_DMA_ENABLE(ADC1);
  51.     /* Enable ADC1 */
  52.     ADC_ENABLE(ADC1);
  53.     /* Enable ADC1 reset calibaration register */
  54.     ADC_RST_CAL(ADC1);
  55.     /* Check the end of ADC1 reset calibration register */
  56.     while(ADC_GET_RST_CAL_STATUS(ADC1));
  57.     /* Start ADC1 calibaration */
  58.     ADC_START_CAL(ADC1);
  59.     /* Check the end of ADC1 calibration */
  60.     while(ADC_GET_CAL_STATUS(ADC1));

  61.     /* Enable ADC2 */
  62.     ADC_ENABLE(ADC2);
  63.     ADC_RST_CAL(ADC2);
  64.     while(ADC_GET_RST_CAL_STATUS(ADC2));
  65.     ADC_START_CAL(ADC2);
  66.     while(ADC_GET_CAL_STATUS(ADC2));

  67.         /**
  68.          * DMA1 channel1 deinitialize
  69.          */
  70.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  71.     DMA_DISABLE(DMA1_Channel1);
  72.     DMA1_Channel1->CCR = 0;
  73.     DMA1_Channel1->CNDTR = 0;
  74.     DMA1_Channel1->CMAR = 0;
  75.     DMA1_Channel1->CPAR = 0;
  76.     CLR_IT_FLAG(DMA1, Channel1);

  77.     /**
  78.      * DMA1 channel1 configuration
  79.      */
  80.     DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR);
  81.     DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)&g_adc12_value[0];
  82.     DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralSRC;
  83.     DMA_InitStructure.DMA_BufferSize         = NUM_OF_REG_CHANNEL; /* ָʾDMAʹÓöàÉÙ¸öÊý¾Ý,²»Äܳ¬¹ýÊý×é´óС.µ¥Î»ÊÇDMA_MemoryDataSize */
  84.     DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
  85.     DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;
  86.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; /* ÕâÊÇADC2ʹÓÃDMAµÄÒªÇó.low 16bit=adc1,high 16bit=adc2 */
  87.     DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Word;
  88.     DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal; /* normal=Ö»´«ËÍÒ»´Î */
  89.     DMA_InitStructure.DMA_Priority           = DMA_Priority_VeryHigh;
  90.     DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;
  91.     DMA_Init(DMA1_Channel1, &DMA_InitStructure);


 楼主| lanmanck 发表于 2016-2-5 15:01 | 显示全部楼层
可以结贴了,高手在博客
http://www.tuicool.com/articles/ZniQFr
zhuotuzi 发表于 2016-2-6 17:34 | 显示全部楼层
这两个功能两不挨啊,你PWM初始化配置好就自动运行了,而ADC可以中断触发嘛,比如定时器触发。
quray1985 发表于 2016-2-8 16:21 | 显示全部楼层
我用过stm32的adc用定时器触发的,就是要设置一下adc的外部触发源
734774645 发表于 2016-2-10 10:55 | 显示全部楼层
应该是配置好PWM后,你不去管他,他也可以正常工作,这个时候你就该做ADC,还是坐ADC。
玛尼玛尼哄 发表于 2016-2-10 14:55 | 显示全部楼层
用示波器直接观察就行了。就可以知道电压。
yiyigirl2014 发表于 2016-2-10 18:48 | 显示全部楼层
你采集那一瞬间的ADC,真是不好控制时间。
haozhengnaxi 发表于 2017-12-2 14:44 | 显示全部楼层
请问楼主这个问题解决了吗,,我也遇到了这个问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:跟阿里云拼了: http://www.qcloud.com/redirect.php?redirect=1001&cps_key=361a94179534e81fbc22912619cc97ef

154

主题

400

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部