Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.97 KB | None | 0 0
  1. /**
  2.   ******************************************************************************
  3.   * @file    main.c
  4.   * @author  Ac6
  5.   * @version V1.0
  6.   * @date    01-December-2013
  7.   * @brief   Default main function.
  8.   ******************************************************************************
  9. */
  10.  
  11.  
  12. #include "stm32f4xx.h"
  13. #include "stm32f4_discovery.h"
  14.            
  15. int ADC_Result;
  16. double Uin;
  17.  
  18. int main(void)
  19. {
  20.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  21.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  22.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  23.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  24.  
  25.     //PINY DLA LED
  26.     GPIO_InitTypeDef  GPIO_InitStructure;
  27.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_TIM3);
  28.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_TIM3);
  29.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_TIM3);
  30.  
  31.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_5 | GPIO_Pin_6;
  32.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  33.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  34.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  35.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  36.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  37.     //PINY DLA LED
  38.  
  39.  
  40.     //PORT PA1 DLA ADC1
  41.     GPIO_InitTypeDef GPIO_InitStructure2;
  42.     GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_1;
  43.     GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_AN;
  44.     GPIO_InitStructure2.GPIO_PuPd = GPIO_PuPd_NOPULL;
  45.     GPIO_Init(GPIOA, &GPIO_InitStructure2);
  46.     //PORT PA1 DLA ADC1
  47.  
  48.     //ADC
  49.     ADC_CommonInitTypeDef ADC_CommonInitStructure;
  50.         // niezależny tryb pracy przetworników
  51.     ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  52.         // zegar główny podzielony przez 2
  53.     ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  54.         // opcja istotna tylko dla trybu multi ADC
  55.     ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  56.         // czas przerwy pomiędzy kolejnymi konwersjami
  57.     ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  58.     ADC_CommonInit(&ADC_CommonInitStructure);
  59.  
  60.     ADC_InitTypeDef ADC_InitStructure;
  61.         //ustawienie rozdzielczości przetwornika na maksymalną (12 bitów)
  62.     ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  63.         //wyłączenie trybu skanowania (odczytywać będziemy jedno wejście ADC
  64.         //w trybie skanowania automatycznie wykonywana jest konwersja na wielu  //wejściach/kanałach)
  65.     ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  66.         //włączenie ciągłego trybu pracy
  67.     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  68.         //wyłączenie zewnętrznego wyzwalania
  69.         //konwersja może być wyzwalana timerem, stanem wejścia itd. (szczegóły w //dokumentacji)
  70.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  71.     ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  72.         //wartość binarna wyniku będzie podawana z wyrównaniem do prawej
  73.         //funkcja do odczytu stanu przetwornika ADC zwraca wartość 16-bitową
  74.         //dla przykładu, wartość 0xFF wyrównana w prawo to 0x00FF, w lewo 0x0FF0
  75.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  76.         //liczba konwersji równa 1, bo 1 kanał
  77.     ADC_InitStructure.ADC_NbrOfConversion = 1;
  78.         // zapisz wypełnioną strukturę do rejestrów przetwornika numer 1
  79.     ADC_Init(ADC1, &ADC_InitStructure);
  80.  
  81.         //W następnej kolejności należy skonfigurować wybrany kanał ADC:
  82.     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_84Cycles);
  83.         //uruchomienie
  84.     ADC_Cmd(ADC1, ENABLE);
  85.     //ADC
  86.  
  87.     //TIMER
  88.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  89.     TIM_TimeBaseStructure.TIM_Period = 999;
  90.     TIM_TimeBaseStructure.TIM_Prescaler = 83;
  91.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  92.     TIM_TimeBaseStructure.TIM_CounterMode =  TIM_CounterMode_Up;
  93.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  94.  
  95.     TIM_OCInitTypeDef TIM_OCInitStructure;
  96.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  97.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  98.     TIM_OCInitStructure.TIM_Pulse = 0;
  99.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  100.  
  101.     TIM_OC1Init(TIM3, &TIM_OCInitStructure);
  102.     TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
  103.  
  104.     TIM_OC2Init(TIM3, &TIM_OCInitStructure);
  105.     TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
  106.  
  107.     TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  108.     TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
  109.  
  110.     TIM3->CCR1 = 10000;
  111.     TIM3->CCR3 = 10000;
  112.     TIM3->CCR4 = 10000;
  113.  
  114.     TIM_Cmd(TIM3, ENABLE);
  115.     //TIMER
  116.  
  117.  
  118.     for(;;){
  119.         ADC_SoftwareStartConv(ADC1);
  120.         while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
  121.         ADC_Result = ADC_GetConversionValue(ADC1);
  122.         Uin= (double)(ADC_Result/4095.0 * 9900.0);
  123.         if((int)Uin <= 2100){
  124.             TIM3->CCR1 = 0;
  125.             TIM3->CCR2 = 0;
  126.             TIM3->CCR3 = 0;
  127.         }else if((int)Uin <= 4200 && (int)Uin > 2100){
  128.             TIM3->CCR1 = 33;
  129.             TIM3->CCR2 = 33;
  130.             TIM3->CCR3 = 33;
  131.         }else if((int)Uin <= 6300 && (int)Uin > 4200){
  132.             TIM3->CCR1 = 66;
  133.             TIM3->CCR2 = 66;
  134.             TIM3->CCR3 = 66;
  135.         }else if((int)Uin > 6300){
  136.             TIM3->CCR1 = 100;
  137.             TIM3->CCR2 = 100;
  138.             TIM3->CCR3 = 100;
  139.         }
  140.     }
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement