void adc_set(uint8_t channel, uint8_t rising){ adc_rising = rising; ADC_ExternalTrigInjectedConvCmd(ADC1, DISABLE); pwm_trig_led=0; ADC_InjectedChannelConfig(ADC1, channel, 1, ADC_SampleTime_28Cycles5); adc_delay_count = 0; adc_count = 0; adc_filtered = 0; ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE); pwm_trig_led=1; }
/******************************************************************************* * Function Name : SVPWM_InjectedConvConfig * Description : This function configure ADC1 for 3 shunt current * reading and temperature and voltage feedbcak after a * calibration of the three utilized ADC Channels * Input : None * Output : None * Return : None *******************************************************************************/ void SVPWM_InjectedConvConfig(void) { /* ADC1 Injected conversions configuration */ ADC_InjectedSequencerLengthConfig(ADC1,2); ADC_InjectedSequencerLengthConfig(ADC2,2); ADC_InjectedChannelConfig(ADC1, PHASE_B_ADC_CHANNEL,1,SAMPLING_TIME_CK); ADC_InjectedChannelConfig(ADC1, BUS_VOLT_FDBK_CHANNEL,2,SAMPLING_TIME_CK); /* ADC1 Injected conversions trigger is TIM1 TRGO */ ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_TRGO); ADC_ExternalTrigInjectedConvCmd(ADC2,ENABLE); /* Bus voltage protection initialization*/ ADC_AnalogWatchdogCmd(ADC1,ADC_AnalogWatchdog_SingleInjecEnable); ADC_AnalogWatchdogSingleChannelConfig(ADC1,BUS_VOLT_FDBK_CHANNEL); ADC_AnalogWatchdogThresholdsConfig(ADC1, OVERVOLTAGE_THRESHOLD>>3,0x00); /* ADC1 Injected group of conversions end and Analog Watchdog interrupts enabling */ ADC_ITConfig(ADC1, ADC_IT_JEOC | ADC_IT_AWD, ENABLE); /* ADC2 Injected conversions configuration */ ADC_InjectedSequencerLengthConfig(ADC2,2); ADC_InjectedChannelConfig(ADC2, PHASE_A_ADC_CHANNEL, 1,SAMPLING_TIME_CK); ADC_InjectedChannelConfig(ADC2, TEMP_FDBK_CHANNEL, 2,SAMPLING_TIME_CK); }
void adc1_2_irq_handler(void){ uint16_t new_value; ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC); new_value = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1); if(adc_delay_count == 0) adc_filtered = new_value; else adc_filtered = ((adc_filtered * 3) + new_value) >> 2; if(adc_delay_count > 5){ if(adc_rising){ if(adc_filtered > adc_level + 100){ if(adc_count < 3){ adc_count++; }else{ LED_ORANGE_TOGGLE(); ADC_ExternalTrigInjectedConvCmd(ADC1, DISABLE); pwm_trig_led=0; if(adc_comm) comm_tim_set_next_comm(); } } }else{ if(adc_filtered < adc_level){ if(adc_count < 3){ adc_count++; }else{ LED_ORANGE_TOGGLE(); ADC_ExternalTrigInjectedConvCmd(ADC1, DISABLE); pwm_trig_led=0; if(adc_comm) comm_tim_set_next_comm(); } } } }else{ adc_delay_count++; } }
void SVPWM_3ShuntCurrentReadingCalibration(void) { static u16 bIndex; /* ADC1 Injected group of conversions end interrupt disabling */ ADC_ITConfig(ADC1, ADC_IT_JEOC, DISABLE); hPhaseAOffset=0; hPhaseBOffset=0; hPhaseCOffset=0; /* ADC1 Injected conversions trigger is given by software and enabled */ ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None); ADC_ExternalTrigInjectedConvCmd(ADC1,ENABLE); /* ADC1 Injected conversions configuration */ ADC_InjectedSequencerLengthConfig(ADC1,3); ADC_InjectedChannelConfig(ADC1, PHASE_A_ADC_CHANNEL,1,SAMPLING_TIME_CK); ADC_InjectedChannelConfig(ADC1, PHASE_B_ADC_CHANNEL,2,SAMPLING_TIME_CK); ADC_InjectedChannelConfig(ADC1, PHASE_C_ADC_CHANNEL,3,SAMPLING_TIME_CK); /* Clear the ADC1 JEOC pending flag */ ADC_ClearFlag(ADC1, ADC_FLAG_JEOC); ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE); /* ADC Channel used for current reading are read in order to get zero currents ADC values*/ for(bIndex=0; bIndex <NB_CONVERSIONS; bIndex++) { while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_JEOC)) { } hPhaseAOffset += (ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1)>>3); hPhaseBOffset += (ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_2)>>3); hPhaseCOffset += (ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_3)>>3); /* Clear the ADC1 JEOC pending flag */ ADC_ClearFlag(ADC1, ADC_FLAG_JEOC); ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE); } SVPWM_InjectedConvConfig( ); }
/* Usage: adc_init_single(ADC1, 1, 1, 0, 0); ... would enable ADC1, enabling channels 1 and 2, but not 3 and 4. */ static inline void adc_init_single(ADC_TypeDef * adc_t, uint8_t chan1, uint8_t chan2, uint8_t chan3, uint8_t chan4) { GPIO_InitTypeDef gpio; ADC_InitTypeDef adc; uint8_t num_channels, rank; // Paranoia, must be down for 2+ ADC clock cycles before calibration ADC_Cmd(adc_t, DISABLE); /* enable adc_t clock */ if (adc_t == ADC1) { #ifdef USE_AD1 num_channels = NB_ADC1_CHANNELS; ADC1_GPIO_INIT(gpio); #endif } else if (adc_t == ADC2) { #ifdef USE_AD2 num_channels = NB_ADC2_CHANNELS; ADC2_GPIO_INIT(gpio); #endif } /* Configure ADC */ adc.ADC_Mode = ADC_Mode_Independent; adc.ADC_ScanConvMode = ENABLE; adc.ADC_ContinuousConvMode = DISABLE; adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; adc.ADC_DataAlign = ADC_DataAlign_Right; adc.ADC_NbrOfChannel = 0; // No. of channels in regular mode ADC_Init(adc_t, &adc); ADC_InjectedSequencerLengthConfig(adc_t, num_channels); rank = 1; if (chan1) { ADC_InjectedChannelConfig(adc_t, adc_channel_map[0], rank, ADC_SampleTime_41Cycles5); rank++; } if (chan2) { ADC_InjectedChannelConfig(adc_t, adc_channel_map[1], rank, ADC_SampleTime_41Cycles5); rank++; } if (chan3) { ADC_InjectedChannelConfig(adc_t, adc_channel_map[2], rank, ADC_SampleTime_41Cycles5); rank++; } if (chan4) { ADC_InjectedChannelConfig(adc_t, adc_channel_map[3], rank, ADC_SampleTime_41Cycles5); } ADC_ExternalTrigInjectedConvCmd(adc_t, ENABLE); #if defined(USE_AD_TIM4) ADC_ExternalTrigInjectedConvConfig(adc_t, ADC_ExternalTrigInjecConv_T4_TRGO); #elif defined(USE_AD_TIM1) ADC_ExternalTrigInjectedConvConfig(adc_t, ADC_ExternalTrigInjecConv_T1_TRGO); #else ADC_ExternalTrigInjectedConvConfig(adc_t, ADC_ExternalTrigInjecConv_T2_TRGO); #endif /* Enable ADC<X> JEOC interrupt */ ADC_ITConfig(adc_t, ADC_IT_JEOC, ENABLE); /* Enable ADC<X> */ ADC_Cmd(adc_t, ENABLE); /* Enable ADC<X> reset calibaration register */ ADC_ResetCalibration(adc_t); /* Check the end of ADC<X> reset calibration */ while (ADC_GetResetCalibrationStatus(adc_t)) ; /* Start ADC<X> calibaration */ ADC_StartCalibration(adc_t); /* Check the end of ADC<X> calibration */ while (ADC_GetCalibrationStatus(adc_t)) ; } // adc_init_single
void adcInit(void) { ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; adcSetConstants(); histSize = ADC_HIST_SIZE; // Use STM32's Dual Regular Simultaneous Mode capable of ~ 1.7M samples per second // NOTE: assume that RCC code has already placed all pins into Analog In mode during startup // DMA1 channel1 configuration (ADC1) DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1 + 0x4c; //从这个寄存器读 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&adcRawData[0]; //写入到这个内存 DMA_InitStructure.DMA_BufferSize = sizeof(adcRawData)/4; //传输数据量 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //从外设读 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不递加 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //存储器地址递加 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//外设数据宽度32位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //存储器数据宽度32位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环模式 DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //通道优先级最高 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //非存储器到存储器模式 DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel1, DMA_IT_TC | DMA_IT_HT, ENABLE); DMA_ClearITPendingBit(DMA1_IT_GL1 | DMA1_IT_TC1 | DMA1_IT_HT1); DMA_Cmd(DMA1_Channel1, ENABLE); // Enable the DMA1_Channel1 global Interrupt NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // ADC1 configuration // ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; ADC_InitStructure.ADC_Mode = ADC_Mode_RegInjecSimult;//混合的同步规则+注入同步模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使用扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //SWSTART 软件触发模式 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = sizeof(adcRawData)/4;//规则通道序列长度 有8个转换通道 ADC_Init(ADC1, &ADC_InitStructure); #ifdef ADC_FAST_SAMPLE //有8个转换通道 都是规则转换序列 //ADC_SAMPLE_TIME是AD的采样时间 ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SAMPLE_TIME); // SENSE_CURRENT ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SAMPLE_TIME); // SENSE_CURRENT ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SAMPLE_TIME); // SENSE_B ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 4, ADC_SAMPLE_TIME); // SENSE_B ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SAMPLE_TIME); // SENSE_VIN ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 6, ADC_SAMPLE_TIME); // SENSE_VIN ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 7, ADC_SAMPLE_TIME); // SENSE_B ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 8, ADC_SAMPLE_TIME); // SENSE_B #else ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SAMPLE_TIME); // SENSE_CURRENT ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SAMPLE_TIME); // SENSE_B ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 3, ADC_SAMPLE_TIME); // SENSE_VIN ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 4, ADC_SAMPLE_TIME); // SENSE_B #endif ADC_DMACmd(ADC1, ENABLE);//ADC1开启DMA模式 // ADC2 configuration //ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; ADC_InitStructure.ADC_Mode = ADC_Mode_RegInjecSimult; //混合的同步规则+注入同步模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使用扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //SWSTART 软件触发模式 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = sizeof(adcRawData)/4; //规则通道序列长度 有8个转换通道 ADC_Init(ADC2, &ADC_InitStructure); #ifdef ADC_FAST_SAMPLE ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SAMPLE_TIME); // SENSE_A ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 2, ADC_SAMPLE_TIME); // SENSE_A ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 3, ADC_SAMPLE_TIME); // SENSE_C ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 4, ADC_SAMPLE_TIME); // SENSE_C ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 5, ADC_SAMPLE_TIME); // SENSE_A ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 6, ADC_SAMPLE_TIME); // SENSE_A ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 7, ADC_SAMPLE_TIME); // SENSE_C ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 8, ADC_SAMPLE_TIME); // SENSE_C #else ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SAMPLE_TIME); // SENSE_A ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 2, ADC_SAMPLE_TIME); // SENSE_C ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 3, ADC_SAMPLE_TIME); // SENSE_A ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 4, ADC_SAMPLE_TIME); // SENSE_C #endif ADC_ExternalTrigConvCmd(ADC2, ENABLE);//使用外部事件启动转换 // enable and calibrate ADC_Cmd(ADC1, ENABLE); adcCalibrateADC(ADC1); ADC_Cmd(ADC2, ENABLE); adcCalibrateADC(ADC2); nextCrossingDetect = adcMaxPeriod; // setup injection sequence // 设置注入序列 ADC_InjectedSequencerLengthConfig(ADC1, 1);//注入序列只有1个转换 ADC_InjectedSequencerLengthConfig(ADC2, 1); ADC_InjectedChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SAMPLE_TIME);//设置注入序列转换的通道 ADC_InjectedChannelConfig(ADC2, ADC_Channel_4, 1, ADC_SAMPLE_TIME); ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE);//注入序列 使用外部事件启动转换 ADC_ExternalTrigInjectedConvCmd(ADC2, ENABLE); ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);//软件触发 ADC_ExternalTrigInjectedConvConfig(ADC2, ADC_ExternalTrigInjecConv_None); // Start ADC1 / ADC2 Conversions ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开始转换.并设置好外部触发模式 }
void adcInit(void) { ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; int i; adcSetConstants(); histSize = ADC_HIST_SIZE; // Use STM32's Dual Regular Simultaneous Mode capable of ~ 1.7M samples per second // NOTE: assume that RCC code has already placed all pins into Analog In mode during startup // DMA1 channel1 configuration (ADC1) DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1 + 0x4c; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&adcRawData[0]; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = sizeof(adcRawData)/4; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel1, DMA_IT_TC | DMA_IT_HT, ENABLE); DMA_ClearITPendingBit(DMA1_IT_GL1 | DMA1_IT_TC1 | DMA1_IT_HT1); DMA_Cmd(DMA1_Channel1, ENABLE); // Enable the DMA1_Channel1 global Interrupt NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // ADC1 configuration // ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; ADC_InitStructure.ADC_Mode = ADC_Mode_RegInjecSimult; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = sizeof(adcRawData)/4; ADC_Init(ADC1, &ADC_InitStructure); #ifdef ADC_FAST_SAMPLE ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SAMPLE_TIME); // SENSE_CURRENT ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SAMPLE_TIME); // SENSE_CURRENT ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SAMPLE_TIME); // SENSE_B ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 4, ADC_SAMPLE_TIME); // SENSE_B ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SAMPLE_TIME); // SENSE_VIN ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 6, ADC_SAMPLE_TIME); // SENSE_VIN ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 7, ADC_SAMPLE_TIME); // SENSE_B ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 8, ADC_SAMPLE_TIME); // SENSE_B #else ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SAMPLE_TIME); // SENSE_CURRENT ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SAMPLE_TIME); // SENSE_B ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 3, ADC_SAMPLE_TIME); // SENSE_VIN ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 4, ADC_SAMPLE_TIME); // SENSE_B #endif ADC_DMACmd(ADC1, ENABLE); // ADC2 configuration // ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; ADC_InitStructure.ADC_Mode = ADC_Mode_RegInjecSimult; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = sizeof(adcRawData)/4; ADC_Init(ADC2, &ADC_InitStructure); #ifdef ADC_FAST_SAMPLE ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SAMPLE_TIME); // SENSE_A ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 2, ADC_SAMPLE_TIME); // SENSE_A ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 3, ADC_SAMPLE_TIME); // SENSE_C ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 4, ADC_SAMPLE_TIME); // SENSE_C ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 5, ADC_SAMPLE_TIME); // SENSE_A ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 6, ADC_SAMPLE_TIME); // SENSE_A ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 7, ADC_SAMPLE_TIME); // SENSE_C ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 8, ADC_SAMPLE_TIME); // SENSE_C #else ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SAMPLE_TIME); // SENSE_A ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 2, ADC_SAMPLE_TIME); // SENSE_C ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 3, ADC_SAMPLE_TIME); // SENSE_A ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 4, ADC_SAMPLE_TIME); // SENSE_C #endif ADC_ExternalTrigConvCmd(ADC2, ENABLE); // enable and calibrate ADC_Cmd(ADC1, ENABLE); adcCalibrateADC(ADC1); ADC_Cmd(ADC2, ENABLE); adcCalibrateADC(ADC2); nextCrossingDetect = adcMaxPeriod; // setup injection sequence ADC_InjectedSequencerLengthConfig(ADC1, 1); ADC_InjectedSequencerLengthConfig(ADC2, 1); ADC_InjectedChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SAMPLE_TIME); ADC_InjectedChannelConfig(ADC2, ADC_Channel_4, 1, ADC_SAMPLE_TIME); ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE); ADC_ExternalTrigInjectedConvCmd(ADC2, ENABLE); ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None); ADC_ExternalTrigInjectedConvConfig(ADC2, ADC_ExternalTrigInjecConv_None); // Start ADC1 / ADC2 Conversions ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
void adc_init(void){ NVIC_InitTypeDef nvic; GPIO_InitTypeDef gpio; ADC_InitTypeDef adc; /* enable ADC1 clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* Configure and enable ADC interrupt */ nvic.NVIC_IRQChannel = ADC1_2_IRQn; nvic.NVIC_IRQChannelPreemptionPriority = 0; nvic.NVIC_IRQChannelSubPriority = 0; nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic); /* GPIOA: ADC Channel 0, 1, 2 as analog input * Ch 0 -> BEMF/I_Sense of PHASE A * Ch 1 -> BEMF/I_Sense of PHASE B * Ch 2 -> BEMF/I_Sense of PHASE C */ gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; gpio.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &gpio); adc_comm = 0; adc_filtered = 0; /* Configure ADC1 */ adc.ADC_Mode = ADC_Mode_Independent; adc.ADC_ScanConvMode = DISABLE; adc.ADC_ContinuousConvMode = DISABLE; adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; adc.ADC_DataAlign = ADC_DataAlign_Right; adc.ADC_NbrOfChannel = 0; ADC_Init(ADC1, &adc); ADC_InjectedSequencerLengthConfig(ADC1, 1); ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_28Cycles5); ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_CC4); ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE); /* Enable ADC1 JEOC interrupt */ ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Enable ADC1 External Trigger */ ADC_ExternalTrigConvCmd(ADC1, ENABLE); //ADC_ExternalTrigConvCmd(ADC1, DISABLE); }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ /* System clocks configuration ---------------------------------------------*/ RCC_Configuration(); /* NVIC configuration ------------------------------------------------------*/ NVIC_Configuration(); /* GPIO configuration ------------------------------------------------------*/ GPIO_Configuration(); /* EXTI configuration ------------------------------------------------------*/ EXTI_Configuration(); /* DMA1 channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_RegularConvertedValueTab; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 64; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 2; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channels configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_28Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 2, ADC_SampleTime_28Cycles5); /* Regular discontinuous mode channel number configuration */ ADC_DiscModeChannelCountConfig(ADC1, 1); /* Enable regular discontinuous mode */ ADC_DiscModeCmd(ADC1, ENABLE); /* Enable ADC1 external trigger conversion */ ADC_ExternalTrigConvCmd(ADC1, ENABLE); /* Set injected sequencer length */ ADC_InjectedSequencerLengthConfig(ADC1, 2); /* ADC1 injected channel configuration */ ADC_InjectedChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_28Cycles5); ADC_InjectedChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_28Cycles5); /* ADC1 injected external trigger configuration */ ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4); /* Enable ADC1 injected external trigger conversion */ ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE); /* Enable JEOC interrupt */ ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); while (1) { } }