OpenEdv-开源电子网

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

STM32 交流电压采样 ADC 变换 DMA传输

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2011-12-9
在线时间
0 小时
发表于 2011-12-9 17:29:53 | 显示全部楼层 |阅读模式

 /* ADC1 registers reset ----------------------------------------------------*/
ADC_DeInit(ADC1);

/* ADC1 configuration ------------------------------------------------------*/
ADC_StructInit(&my_ADC_InitStructure);
my_ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
my_ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
my_ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
my_ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; (7.5K)、、  此处也用于产生PWM波。使用了刹车功能。
my_ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
my_ADC_InitStructure.ADC_NbrOfChannel = AC_CLASS_NUM;
ADC_Init(ADC1, &my_ADC_InitStructure);

// CLKad = 12MHz Tconv = 7.5 + 12.5 = 20周期 f_conv = 12MHz / 20 = 600K
ADC_InjectedChannelConfig(ADC1, ADC_Channel_4, AC_CLASS_ACV+1, ADC_SampleTime_7Cycles5); // AD_ACV
ADC_InjectedChannelConfig(ADC1, ADC_Channel_5, AC_CLASS_ACI+1, ADC_SampleTime_7Cycles5); // AD_ACI


DMA_DeInit(DMA1_Channel1);
my_DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
my_DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&gm_SampleTempData.ACdata[0][0];
my_DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
my_DMA_InitStructure.DMA_BufferSize = AC_SAMPLE_COUNT_NUM * AC_CLASS_NUM;
my_DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
my_DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
my_DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
my_DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
my_DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
my_DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
my_DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &my_DMA_InitStructure);
// Enable DMA1 channel1
DMA_Cmd(DMA1_Channel1, ENABLE);


TIM_OCStructInit(&my_TIM1_OCInitStructure);
// PWM 模式2
// 在向上计数时,一旦TIM1_CNT // 在向下计数时,一旦TIM1_CNT>TIM1_CCR1 时通道3 为有效电平,否则为无效电平
my_TIM1_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
// 输入/捕获 输出使能
my_TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
// 输入/捕获 互补输出禁止
my_TIM1_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
// TIM1_CCRx
my_TIM1_OCInitStructure.TIM_Pulse = PWM1_PERIOD(gm_RCC_ClockFreq.PCLK2_Frequency) >> 1; // 占空比初始化为 50%
// OCx 高电平有效
my_TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
// OCxN 低电平有效
my_TIM1_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
// 当MOE=0 时,如果实现了OCx/OCxN,则死区后OCxN/OCx=0
my_TIM1_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
my_TIM1_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

TIM_OC3Init(TIM1, &my_TIM1_OCInitStructure);


void ConfigTimer1ForPwm1(void)
{
 TIM_TimeBaseInitTypeDef  my_TIM1_TimeBaseStructure;
 TIM_OCInitTypeDef     my_TIM1_OCInitStructure;

  TIM_DeInit(TIM1);
 TIM_TimeBaseStructInit(&my_TIM1_TimeBaseStructure);

    /* Time Base configuration */
 // CK_CNT = FCK_PSC / 1
   my_TIM1_TimeBaseStructure.TIM_Prescaler = PWM1_PRSC;
 // 选择中央对齐模式: 中央对齐模式1。计数器交替地向上和向下计数。
 //配置为输出的通道(TIM1_CCMRx 寄存器中CCxS=00)的输出比较中断标志位,只在计数器向下计数时被设置         
   my_TIM1_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
 // TIM1_ARR
 my_TIM1_TimeBaseStructure.TIM_Period = PWM1_PERIOD(gm_RCC_ClockFreq.PCLK2_Frequency);
 // TIM1_CR1. CKD[1:0]
 // tDTS = 2 x tCK_INT
   my_TIM1_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;
 // TIM1_RCRx
   my_TIM1_TimeBaseStructure.TIM_RepetitionCounter =  TIMER1_REP_RATE;

   TIM_TimeBaseInit(TIM1, &my_TIM1_TimeBaseStructure);

 /* Channel 1, 2 Configuration in PWM mode */
  TIM_OCStructInit(&my_TIM1_OCInitStructure);
 // PWM 模式1
 // 在向上计数时,一旦TIM1_CNT<TIM1_CCR1 时通道1 为有效电平,否则为无效电平;
 // 在向下计数时,一旦TIM1_CNT>TIM1_CCR1 时通道1 为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)
 my_TIM1_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
 // 输入/捕获 输出使能
 my_TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
 // 输入/捕获 互补输出使能
 my_TIM1_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
 // TIM1_CCRx
 my_TIM1_OCInitStructure.TIM_Pulse =  PWM1_PERIOD(gm_RCC_ClockFreq.PCLK2_Frequency) >> 1;    // 占空比初始化为 0
 // OCx 高电平有效
 my_TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
 // OCxN 高电平有效
 my_TIM1_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
 // 当MOE=0 时,如果实现了OCx/OCxN,则死区后OCxN/OCx=0
 my_TIM1_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
 my_TIM1_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
 
 TIM_OC1Init(TIM1, &my_TIM1_OCInitStructure);


该配置下的试验结果如下:
我做1V电压的交流采样,并进行ADC变换。最低电压约为-1.414.我叠加了1.65的直流,现在最低电压就差不多0.235左右。最高电压约3.064左右。参考电压是3.3的,转换的结果是存到gm_SampleTempData.ACdata[2][150]里面的,ACdata[0]是交流电压,ACdata[1]是交流电流,ACdata[0]的150个元素中有000和FFF。我不知道这是ADC的问题还是数学统计里面的问题 而且,我只做了交流电压采样,有的交流电流还有数据,不能理解!会不会是这个 ADC_ExternalTrigConv_T1_CC1; (7.5K)触发信号不对?还请大家指导!

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2011-12-9 17:46:09 | 显示全部楼层
回复【楼主位】迷雾重重:
---------------------------------
先单独弄稳定了,再去弄DMA吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2011-12-9
在线时间
0 小时
 楼主| 发表于 2011-12-12 17:12:12 | 显示全部楼层
谢谢回复。
我目前的配置采样直流电压,并且用DMA传输是没有问题的。因为我初学,并且是直接接手调试别人的程序。目前我要采样150点交流电压,如果不用DMA的话,我不知道怎么看数据。
目前的情况是这样的:
对50HZ交流电压采样,ADC由TIM1的CC1触发。频率为7.5KHZ.也就是说我在一个交流电压信号的周期内可以采样150个点。   但是我运行程序的时候发现就只采了16个点,然后有70个左右的点数据为0(估计就是没有采样成功,或者是DMA没有传输过去).之后又有十多个点有数据。。。
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2011-11-4
在线时间
0 小时
发表于 2012-9-10 15:15:16 | 显示全部楼层
迷雾重重,你好。现在你的交流电压电流采集弄好了吗?我现在也在弄这个东西,存在一些问题啊。交流电压采集一个周波内采64个点,3.2KHZ频率。但是读出来的周波内的数据不正确 啊。
回复 支持 反对

使用道具 举报

11

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
356
金钱
356
注册时间
2013-11-9
在线时间
145 小时
发表于 2014-3-6 14:41:28 | 显示全部楼层
回复【4楼】woshizu:
---------------------------------
我想问一下:你们有没有碰到过电压商店的时候(电流端不接),电流端的采集数据变化。还有就是电流端负载通电的时候电流的采集数据不变。这是什么原因?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 15:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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