Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- ******************************************************************************
- * @file main.c
- * @author Ac6
- * @version V1.0
- * @date 01-December-2013
- * @brief Default main function.
- ******************************************************************************
- */
- #include "stm32f4xx.h"
- #include "stm32f4_discovery.h"
- int ADC_Result;
- double Uin;
- int main(void)
- {
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- //PINY DLA LED
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_TIM3);
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_TIM3);
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_TIM3);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_5 | GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- //PINY DLA LED
- //PORT PA1 DLA ADC1
- GPIO_InitTypeDef GPIO_InitStructure2;
- GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_AN;
- GPIO_InitStructure2.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOA, &GPIO_InitStructure2);
- //PORT PA1 DLA ADC1
- //ADC
- ADC_CommonInitTypeDef ADC_CommonInitStructure;
- // niezależny tryb pracy przetworników
- ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
- // zegar główny podzielony przez 2
- ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
- // opcja istotna tylko dla trybu multi ADC
- ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
- // czas przerwy pomiędzy kolejnymi konwersjami
- ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
- ADC_CommonInit(&ADC_CommonInitStructure);
- ADC_InitTypeDef ADC_InitStructure;
- //ustawienie rozdzielczości przetwornika na maksymalną (12 bitów)
- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
- //wyłączenie trybu skanowania (odczytywać będziemy jedno wejście ADC
- //w trybie skanowania automatycznie wykonywana jest konwersja na wielu //wejściach/kanałach)
- ADC_InitStructure.ADC_ScanConvMode = DISABLE;
- //włączenie ciągłego trybu pracy
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
- //wyłączenie zewnętrznego wyzwalania
- //konwersja może być wyzwalana timerem, stanem wejścia itd. (szczegóły w //dokumentacji)
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
- ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
- //wartość binarna wyniku będzie podawana z wyrównaniem do prawej
- //funkcja do odczytu stanu przetwornika ADC zwraca wartość 16-bitową
- //dla przykładu, wartość 0xFF wyrównana w prawo to 0x00FF, w lewo 0x0FF0
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
- //liczba konwersji równa 1, bo 1 kanał
- ADC_InitStructure.ADC_NbrOfConversion = 1;
- // zapisz wypełnioną strukturę do rejestrów przetwornika numer 1
- ADC_Init(ADC1, &ADC_InitStructure);
- //W następnej kolejności należy skonfigurować wybrany kanał ADC:
- ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_84Cycles);
- //uruchomienie
- ADC_Cmd(ADC1, ENABLE);
- //ADC
- //TIMER
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_TimeBaseStructure.TIM_Period = 999;
- TIM_TimeBaseStructure.TIM_Prescaler = 83;
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
- TIM_OCInitTypeDef TIM_OCInitStructure;
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = 0;
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- TIM_OC1Init(TIM3, &TIM_OCInitStructure);
- TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
- TIM_OC2Init(TIM3, &TIM_OCInitStructure);
- TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
- TIM_OC3Init(TIM3, &TIM_OCInitStructure);
- TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
- TIM3->CCR1 = 10000;
- TIM3->CCR3 = 10000;
- TIM3->CCR4 = 10000;
- TIM_Cmd(TIM3, ENABLE);
- //TIMER
- for(;;){
- ADC_SoftwareStartConv(ADC1);
- while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
- ADC_Result = ADC_GetConversionValue(ADC1);
- Uin= (double)(ADC_Result/4095.0 * 9900.0);
- if((int)Uin <= 2100){
- TIM3->CCR1 = 0;
- TIM3->CCR2 = 0;
- TIM3->CCR3 = 0;
- }else if((int)Uin <= 4200 && (int)Uin > 2100){
- TIM3->CCR1 = 33;
- TIM3->CCR2 = 33;
- TIM3->CCR3 = 33;
- }else if((int)Uin <= 6300 && (int)Uin > 4200){
- TIM3->CCR1 = 66;
- TIM3->CCR2 = 66;
- TIM3->CCR3 = 66;
- }else if((int)Uin > 6300){
- TIM3->CCR1 = 100;
- TIM3->CCR2 = 100;
- TIM3->CCR3 = 100;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement