/* 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)触发信号不对?还请大家指导! |