Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- W programie wykorzystano ponownie funkcję „SetBits(int dioda[])” z zadania nr 1.
- Funkcja „TIM1_UP_IRQHandler(void)” w pliku „main.c”:
- void TIM1_UP_IRQHandler(void)
- {
- if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)//przeladowanie licznika
- TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
- }
- Funkcja „TIM1_CC_IRQHandler(void)” w pliku „main.c”:
- void TIM1_CC_IRQHandler(void){
- if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
- {
- TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
- ADC_ExternalTrigConvCmd(ADC1, ENABLE);
- }
- }
- Funkcja „ADC1_2_IRQHandler(void)” w pliku „main.c”:
- void ADC1_2_IRQHandler(void){
- if (ADC_GetITStatus(ADC1, ADC_IT_AWD)!=RESET)
- {
- ADC_ClearITPendingBit(ADC1, ADC_IT_AWD);
- SetBits(diodyOFF);
- }
- }
- Program główny:
- #include "stm32f10x.h"
- #include "stm32f10x_exti.h"
- #include "stm32f10x_adc.h"
- #include "stm32f10x_tim.h"
- void GPIO_Config(void);
- void RCC_Config(void);
- void NVIC_Config(void);
- void ADC_Config(void);
- void TIM_Config(void);
- void TIM1_UP_IRQHandler(void);
- void TIM1_CC_IRQHandler(void);
- void SetBits(int dioda[]);
- int diodyON[] = {1,1,1,1,0,0,0,0};
- int diodyOFF[] = {0,0,0,0,1,1,1,1};
- volatile uint32_t i = 0;
- int main(void){
- volatile unsigned long int i;
- unsigned long int wartoscADC1 = 0;
- GPIO_ResetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
- GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
- //konfiguracja systemu
- RCC_Config();
- GPIO_Config();
- TIM_Config();
- NVIC_Config();
- ADC_Config();
- while (1)
- {
- ADC_SoftwareStartConvCmd(ADC1, ENABLE);//wyzwolenie pojedynczego pomiaru
- while (!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//odczekaj na zakonczenie konwersji
- wartoscADC1 = ADC_GetConversionValue(ADC1);//pobiez zmierzona wartosc
- SetBits(diodyON);
- };
- while (1);
- return 0;
- }
- Funkcje konfiguracyjne w pliku „main.c”:
- void ADC_Config(void)
- {
- //konfigurowanie przetwornika AC
- ADC_InitTypeDef ADC_InitStructure;
- //Jeden przetwornik, praca niezalezna
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
- //Pomiar jednego kanalu, skanowanie kanalow nie potrzebne
- ADC_InitStructure.ADC_ScanConvMode = DISABLE;
- //Pomiar w trybie jednokrotnym
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
- //Brak wyzwalania zewnetrznego
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
- //Wyrownanie danych do prawej - 12 mlodszych bitow znaczacych
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
- //Liczba uzywanych kanalow =1
- ADC_InitStructure.ADC_NbrOfChannel = 1;
- //Incjalizacja przetwornika
- ADC_Init(ADC1, &ADC_InitStructure);
- ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);
- //Kanal 1 - GPIOA1 - potencjometr na plytce ZL30ARM
- ADC_AnalogWatchdogThresholdsConfig(ADC1, 0x09B1, 0x04D9);
- ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable);
- ADC_AnalogWatchdogSingleChannelConfig(ADC1, ADC_Channel_1);
- //Wlaczenie przerwania od watchdoga analogowego
- //Grupa podstawowa, czas probkowania 1,5+12,5=14 cykli
- ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE);
- ADC_Cmd(ADC1, ENABLE); //Wlacz ADC1
- ADC_ResetCalibration(ADC1); //Reset rejestrow kalibracyjnych ADC1
- while(ADC_GetResetCalibrationStatus(ADC1));//Odczekanie na wykonanie resetu
- ADC_StartCalibration(ADC1); //Kalibracja ADC1
- while(ADC_GetCalibrationStatus(ADC1));//Odczekanie na zakonczenie kalibracji ADC1
- }
- void TIM_Config(void)
- {
- //Konfiguracja timerow
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
- //Konfiguracja licznika 1
- //Ustawienia taktowania i trybu pracy licznika 1
- //taktowanie licznka fclk = 72MHz/7200 = 10kHz
- TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;
- //okres przepelnien licznika = 20000 taktow = 2 sekundy
- TIM_TimeBaseStructure.TIM_Period = 40000;
- //dzielnik zegara dla ukladu generacji dead-time i filtra
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_RepetitionCounter=0; //licznik powtorzen
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //tryb pracy licznika
- TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //Inicjalizacja licznika
- //Konfiguracja kanalu 1
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; //tryb pracy kanalu
- //wlaczenie generowania sygnalu na wyjsciu licznika
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = 5000; //5000 taktow = 0.5s od restartu licznika
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //polaryzacja wyjscia
- TIM_OC1Init(TIM1, &TIM_OCInitStructure); //Inicjalizacja kanalu 1 licznika TIM1
- TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE); //wlaczenie przerwanie od porownania w kanale 1
- //zapis ustawien, wylaczenie buforowania - ewentualne zmiany konfiguracji uwzgledniane sa od razu
- TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);
- //gdy preload jest wlaczony - zmiany wchodza w zycie dopiero przy nastepnym update
- TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); //wlaczenie przerwania od przepelnienia
- // Konfiguracja TIM4
- // Ustawienia ukladu podstawy czasu
- TIM_TimeBaseStructure.TIM_Prescaler = 1200;// 72MHz/1200 = 60kHz
- TIM_TimeBaseStructure.TIM_Period = 170; //czestotliwosc PWM = 1440 Hz 72MHz / wartosc 60KHz
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- // Kanaly 1 i 2 nie uzywane
- // Konfiguracja kanalu 3 - uzywamy kanalu 3 poniewaz jego wyjscie jest na GPIOB8 - gdzie jest LED1
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = 85; //wypelnienie = 50000/25000=50%
- TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
- TIM_OC3Init(TIM4, &TIM_OCInitStructure);
- TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //wlaczenie buforowania
- TIM_ARRPreloadConfig(TIM4, ENABLE); //wlaczenie buforowania
- // Wlaczenie timerow
- TIM_Cmd(TIM1, ENABLE);
- TIM_Cmd(TIM4, ENABLE);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement