打印
[STM32F1]

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

[复制链接]
8675|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 | 只看该作者
测这个没有意义的,你只需要测出来频率和波形就可以了,你用示波器看就行了。

使用特权

评论回复
5
deviceplugs| | 2016-1-31 15:58 | 只看该作者
你搜索一下,adc、dma、tim,我现在就是用timer触发adc启动转换

使用特权

评论回复
6
Dongfangyuxiao| | 2016-1-31 18:39 | 只看该作者
PWM的上升沿或下降沿触发ADC。

使用特权

评论回复
7
lanmanck|  楼主 | 2016-2-4 10:38 | 只看该作者
deviceplugs 发表于 2016-1-31 15:58
你搜索一下,adc、dma、tim,我现在就是用timer触发adc启动转换

哥们能上个初始化代码吗?十分感谢!

使用特权

评论回复
8
lanmanck|  楼主 | 2016-2-4 10:39 | 只看该作者
Dongfangyuxiao 发表于 2016-1-31 18:39
PWM的上升沿或下降沿触发ADC。

是换相有效才触发,不是每个波形都触发

使用特权

评论回复
9
shangwei4444| | 2016-2-4 15:07 | 只看该作者
5楼说的很明确了,TIM触发采样,采样结果直接用DMA存起来。初始化只要看看手册配置一下就行,一共也没有几个寄存器,直接上电看看采样数据,也不会影响别的功能。

使用特权

评论回复
10
lanmanck|  楼主 | 2016-2-5 10:06 | 只看该作者
shangwei4444 发表于 2016-2-4 15:07
5楼说的很明确了,TIM触发采样,采样结果直接用DMA存起来。初始化只要看看手册配置一下就行,一共也没有几 ...

不要说这些我也知道的事情,我要的是代!!码!!
另外,tim触发是count到头了触发还是cc的时候触发,这个有人研究过没?

使用特权

评论回复
11
lanmanck|  楼主 | 2016-2-5 14:06 | 只看该作者
我分享下吧,还有个问题:现在用的是混合注入式+规则,正常使用规则转换,在tim8的cc4做注入式触发,不知道注入式怎么用dma!!!!就是说tim触发的注入式转换不知道怎么用dma传数据出来,难道非要用注入式中断???dma1只有一个channel配置啊!:

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

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

    /* Regular Channel */
        ADC_RegularChannelConfig(ADC2, CH15_LEFT_BUS_CURRENT,1, ADC_SampleTime_13Cycles5);// 1
        ADC_RegularChannelConfig(ADC2, CH5_RESERVED,          2, ADC_SampleTime_13Cycles5);// 3
    ADC_RegularChannelConfig(ADC2, CH6_VREF_1_65,   3, ADC_SampleTime_13Cycles5);//5
    ADC_RegularChannelConfig(ADC2, CH12_BAT_IN,         4, ADC_SampleTime_13Cycles5);//7
    ADC_RegularChannelConfig(ADC2, CH13_15VAD,           5, ADC_SampleTime_13Cycles5);//9
        ADC_RegularChannelConfig(ADC2, CH14_RIGHT_BUS_CURRENT,6, ADC_SampleTime_13Cycles5);//11

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

    ADC_InjectedChannelConfig(ADC1, CH3_RESERVED, 1, ADC_SampleTime_13Cycles5);
    ADC_InjectedChannelConfig(ADC1, CH4_RESERVED, 2, ADC_SampleTime_13Cycles5);
        ADC_InjectedChannelConfig(ADC1, CH10_RESERVED, 3, ADC_SampleTime_13Cycles5);
    ADC_InjectedChannelConfig(ADC1, CH11_RESERVED, 4, ADC_SampleTime_13Cycles5);

    ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4);
    ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE);

        /* ---------------------- ADC2 configuration ------------------------------- */
    /* Injected Channel */
    ADC_InjectedSequencerLengthConfig(ADC2, NUM_OF_INJ_CHANNEL);

    ADC_InjectedChannelConfig(ADC2, CH11_RESERVED, 1, ADC_SampleTime_13Cycles5);
    ADC_InjectedChannelConfig(ADC2, CH10_RESERVED, 2, ADC_SampleTime_13Cycles5);
        ADC_InjectedChannelConfig(ADC2, CH4_RESERVED, 3, ADC_SampleTime_13Cycles5);
    ADC_InjectedChannelConfig(ADC2, CH3_RESERVED, 4, ADC_SampleTime_13Cycles5);

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

    ADC_ExternalTrigInjectedConvCmd(ADC2, ENABLE);

        /* ------------------------------------------------------------------------- */

    /**
     * ADC1
     */
    /* Enable ADC1 DMA */
    ADC_DMA_ENABLE(ADC1);
    /* Enable ADC1 */
    ADC_ENABLE(ADC1);
    /* Enable ADC1 reset calibaration register */
    ADC_RST_CAL(ADC1);
    /* Check the end of ADC1 reset calibration register */
    while(ADC_GET_RST_CAL_STATUS(ADC1));
    /* Start ADC1 calibaration */
    ADC_START_CAL(ADC1);
    /* Check the end of ADC1 calibration */
    while(ADC_GET_CAL_STATUS(ADC1));

    /* Enable ADC2 */
    ADC_ENABLE(ADC2);
    ADC_RST_CAL(ADC2);
    while(ADC_GET_RST_CAL_STATUS(ADC2));
    ADC_START_CAL(ADC2);
    while(ADC_GET_CAL_STATUS(ADC2));

        /**
         * DMA1 channel1 deinitialize
         */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    DMA_DISABLE(DMA1_Channel1);
    DMA1_Channel1->CCR = 0;
    DMA1_Channel1->CNDTR = 0;
    DMA1_Channel1->CMAR = 0;
    DMA1_Channel1->CPAR = 0;
    CLR_IT_FLAG(DMA1, Channel1);

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


使用特权

评论回复
12
lanmanck|  楼主 | 2016-2-5 15:01 | 只看该作者
可以结贴了,高手在博客
http://www.tuicool.com/articles/ZniQFr

使用特权

评论回复
13
zhuotuzi| | 2016-2-6 17:34 | 只看该作者
这两个功能两不挨啊,你PWM初始化配置好就自动运行了,而ADC可以中断触发嘛,比如定时器触发。

使用特权

评论回复
14
quray1985| | 2016-2-8 16:21 | 只看该作者
我用过stm32的adc用定时器触发的,就是要设置一下adc的外部触发源

使用特权

评论回复
15
734774645| | 2016-2-10 10:55 | 只看该作者
应该是配置好PWM后,你不去管他,他也可以正常工作,这个时候你就该做ADC,还是坐ADC。

使用特权

评论回复
16
玛尼玛尼哄| | 2016-2-10 14:55 | 只看该作者
用示波器直接观察就行了。就可以知道电压。

使用特权

评论回复
17
yiyigirl2014| | 2016-2-10 18:48 | 只看该作者
你采集那一瞬间的ADC,真是不好控制时间。

使用特权

评论回复
18
haozhengnaxi| | 2017-12-2 14:44 | 只看该作者
请问楼主这个问题解决了吗,,我也遇到了这个问题

使用特权

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

本版积分规则

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

153

主题

397

帖子

3

粉丝