Advertisement
Guest User

Untitled

a guest
May 29th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.91 KB | None | 0 0
  1. W programie wykorzystano ponownie funkcję „SetBits(int dioda[])” z zadania nr 1.
  2. Funkcja „TIM1_UP_IRQHandler(void)” w pliku „main.c:
  3. void TIM1_UP_IRQHandler(void)
  4. {
  5.     if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)//przeladowanie licznika
  6.     TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
  7. }
  8.  
  9. Funkcja „TIM1_CC_IRQHandler(void)” w pliku „main.c:
  10. void TIM1_CC_IRQHandler(void){
  11.     if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
  12.     {
  13.         TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
  14.         ADC_ExternalTrigConvCmd(ADC1, ENABLE);
  15.     }
  16. }
  17.  
  18. Funkcja „ADC1_2_IRQHandler(void)” w pliku „main.c:
  19. void ADC1_2_IRQHandler(void){
  20.     if (ADC_GetITStatus(ADC1, ADC_IT_AWD)!=RESET)
  21.     {
  22.         ADC_ClearITPendingBit(ADC1, ADC_IT_AWD);
  23.         SetBits(diodyOFF);
  24.     }
  25. }
  26.  
  27. Program główny:
  28. #include "stm32f10x.h"
  29. #include "stm32f10x_exti.h"
  30. #include "stm32f10x_adc.h"
  31. #include "stm32f10x_tim.h"
  32. void GPIO_Config(void);
  33. void RCC_Config(void);
  34. void NVIC_Config(void);
  35. void ADC_Config(void);
  36. void TIM_Config(void);
  37. void TIM1_UP_IRQHandler(void);
  38. void TIM1_CC_IRQHandler(void);
  39. void SetBits(int dioda[]);
  40. int diodyON[] = {1,1,1,1,0,0,0,0};
  41. int diodyOFF[] = {0,0,0,0,1,1,1,1};
  42. volatile uint32_t i = 0;
  43. int main(void){
  44.     volatile unsigned long int i;
  45.     unsigned long int wartoscADC1 = 0;
  46.     GPIO_ResetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
  47.     GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
  48.     //konfiguracja systemu
  49.     RCC_Config();
  50.     GPIO_Config();
  51.     TIM_Config();
  52.     NVIC_Config();
  53.     ADC_Config();
  54.     while (1)
  55.     {
  56.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);//wyzwolenie pojedynczego pomiaru
  57.         while (!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//odczekaj na zakonczenie konwersji
  58.         wartoscADC1 = ADC_GetConversionValue(ADC1);//pobiez zmierzona wartosc
  59.         SetBits(diodyON);
  60.     };
  61.     while (1);
  62.     return 0;
  63. }
  64.  
  65.  
  66. Funkcje konfiguracyjne w pliku „main.c:
  67. void ADC_Config(void)
  68. {
  69.     //konfigurowanie przetwornika AC
  70.     ADC_InitTypeDef ADC_InitStructure;
  71.     //Jeden przetwornik, praca niezalezna
  72.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  73.     //Pomiar jednego kanalu, skanowanie kanalow nie potrzebne
  74.     ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  75.     //Pomiar w trybie jednokrotnym
  76.     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  77.     //Brak wyzwalania zewnetrznego
  78.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  79.     //Wyrownanie danych do prawej - 12 mlodszych bitow znaczacych
  80.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  81.     //Liczba uzywanych kanalow =1
  82.     ADC_InitStructure.ADC_NbrOfChannel = 1;
  83.     //Incjalizacja przetwornika
  84.     ADC_Init(ADC1, &ADC_InitStructure);
  85.     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);
  86.     //Kanal 1 - GPIOA1 - potencjometr na plytce ZL30ARM
  87.     ADC_AnalogWatchdogThresholdsConfig(ADC1, 0x09B1, 0x04D9);
  88.     ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable);
  89.     ADC_AnalogWatchdogSingleChannelConfig(ADC1, ADC_Channel_1);
  90.     //Wlaczenie przerwania od watchdoga analogowego
  91.     //Grupa podstawowa, czas probkowania 1,5+12,5=14 cykli
  92.     ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE);
  93.     ADC_Cmd(ADC1, ENABLE); //Wlacz ADC1
  94.     ADC_ResetCalibration(ADC1); //Reset rejestrow kalibracyjnych ADC1
  95.     while(ADC_GetResetCalibrationStatus(ADC1));//Odczekanie na wykonanie resetu
  96.     ADC_StartCalibration(ADC1); //Kalibracja ADC1
  97.     while(ADC_GetCalibrationStatus(ADC1));//Odczekanie na zakonczenie kalibracji ADC1
  98. }
  99.  
  100. void TIM_Config(void)
  101. {
  102.     //Konfiguracja timerow
  103.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  104.     TIM_OCInitTypeDef TIM_OCInitStructure;
  105.     //Konfiguracja licznika 1
  106.     //Ustawienia taktowania i trybu pracy licznika 1
  107.     //taktowanie licznka fclk = 72MHz/7200 = 10kHz
  108.     TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;
  109.     //okres przepelnien licznika = 20000 taktow = 2 sekundy
  110.     TIM_TimeBaseStructure.TIM_Period = 40000;
  111.     //dzielnik zegara dla ukladu generacji dead-time i filtra
  112.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  113.     TIM_TimeBaseStructure.TIM_RepetitionCounter=0; //licznik powtorzen
  114.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //tryb pracy licznika
  115.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //Inicjalizacja licznika
  116.     //Konfiguracja kanalu 1
  117.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; //tryb pracy kanalu
  118.     //wlaczenie generowania sygnalu na wyjsciu licznika
  119.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  120.     TIM_OCInitStructure.TIM_Pulse = 5000; //5000 taktow = 0.5s od restartu licznika
  121.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //polaryzacja wyjscia
  122.     TIM_OC1Init(TIM1, &TIM_OCInitStructure); //Inicjalizacja kanalu 1 licznika TIM1
  123.     TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE); //wlaczenie przerwanie od porownania w kanale 1
  124.     //zapis ustawien, wylaczenie buforowania - ewentualne zmiany konfiguracji uwzgledniane sa od razu
  125.     TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);
  126.     //gdy preload jest wlaczony - zmiany wchodza w zycie dopiero przy nastepnym update
  127.     TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); //wlaczenie przerwania od przepelnienia
  128.     // Konfiguracja TIM4
  129.     // Ustawienia ukladu podstawy czasu
  130.     TIM_TimeBaseStructure.TIM_Prescaler = 1200;// 72MHz/1200 = 60kHz
  131.     TIM_TimeBaseStructure.TIM_Period = 170; //czestotliwosc PWM = 1440 Hz 72MHz / wartosc 60KHz
  132.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  133.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  134.     // Kanaly 1 i 2 nie uzywane
  135.     // Konfiguracja kanalu 3 - uzywamy kanalu 3 poniewaz jego wyjscie jest na GPIOB8 - gdzie jest LED1
  136.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  137.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  138.     TIM_OCInitStructure.TIM_Pulse = 85; //wypelnienie = 50000/25000=50%
  139.     TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
  140.     TIM_OC3Init(TIM4, &TIM_OCInitStructure);
  141.     TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //wlaczenie buforowania
  142.     TIM_ARRPreloadConfig(TIM4, ENABLE); //wlaczenie buforowania
  143.     // Wlaczenie timerow
  144.     TIM_Cmd(TIM1, ENABLE);
  145.     TIM_Cmd(TIM4, ENABLE);
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement