Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.16 KB | None | 0 0
  1. #include "stm32f4xx_conf.h"
  2. #include "stm32f4xx_gpio.h"
  3. #include "stm32f4xx_rcc.h"
  4. #include "stm32f4xx_tim.h"
  5. #include "stm32f4xx_exti.h"
  6. #include "stm32f4xx_syscfg.h"
  7. //#define __FPU_PRESENT =0
  8. #include<math.h>
  9. volatile int ADC_Result;
  10. volatile double scaled;
  11. int x = 0;
  12. int flaga = 0;
  13. int licznik = 0;
  14. volatile double glob2 = 0;
  15. volatile double ADC_Result2;
  16. volatile double sinus;
  17. void TIM3_IRQHandler(void) {
  18. if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
  19. if (TIM_GetFlagStatus(TIM3, TIM_FLAG_Update)) {
  20. glob2 = glob2 + 0.001;
  21.  
  22. sinus = (1 + sin(glob2 * 6.28) / 2) * 2221;
  23. DAC_SetChannel1Data(DAC_Align_12b_R,
  24. ((1 + sin(glob2 * 6.28)) / 2) * 2221);
  25.  
  26. TIM_ClearFlag(TIM3, TIM_FLAG_Update);
  27. }
  28. TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  29. }
  30. }
  31. int main(void) {
  32.  
  33. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  34. RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOD, ENABLE);
  35. GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);
  36. GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);
  37. GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_TIM4);
  38. GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_TIM4);
  39.  
  40. //////////////////////////////////////////////////////////////
  41.  
  42. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  43.  
  44. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  45.  
  46. GPIO_InitTypeDef GPIO_InitStructure1;
  47. //inicjalizacja wejścia ADC
  48. GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4;
  49. GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_AN;
  50. GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_100MHz;
  51. GPIO_InitStructure1.GPIO_PuPd = GPIO_PuPd_NOPULL;
  52. GPIO_Init(GPIOA, &GPIO_InitStructure1);
  53.  
  54. ADC_CommonInitTypeDef ADC_CommonInitStructure;
  55. // niezależny tryb pracy przetworników
  56. ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  57. // zegar główny podzielony przez 2
  58. ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  59. // opcja istotna tylko dla trybu multi ADC
  60. ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  61. // czas przerwy pomiędzy kolejnymi konwersjami
  62. ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  63. ADC_CommonInit(&ADC_CommonInitStructure);
  64.  
  65. ADC_InitTypeDef ADC_InitStructure;
  66. //ustawienie rozdzielczości przetwornika na maksymalną (12 bitów)
  67. ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  68. //wyłączenie trybu skanowania (odczytywać będziemy jedno wejście ADC
  69. //w trybie skanowania automatycznie wykonywana jest konwersja na wielu //wejściach/kanałach)
  70. ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  71. //włączenie ciągłego trybu pracy
  72. ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  73. //wyłączenie zewnętrznego wyzwalania
  74. //konwersja może być wyzwalana timerem, stanem wejścia itd. (szczegóły w //dokumentacji)
  75. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  76. ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  77. //wartość binarna wyniku będzie podawana z wyrównaniem do prawej
  78. //funkcja do odczytu stanu przetwornika ADC zwraca wartość 16-bitową
  79. //dla przykładu, wartość 0xFF wyrównana w prawo to 0x00FF, w lewo 0x0FF0
  80. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  81. //liczba konwersji równa 1, bo 1 kanał
  82. ADC_InitStructure.ADC_NbrOfConversion = 1;
  83. // zapisz wypełnioną strukturę do rejestrów przetwornika numer 1
  84. ADC_Init(ADC1, &ADC_InitStructure);
  85. ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_84Cycles);
  86.  
  87. ADC_Cmd(ADC1, ENABLE);
  88.  
  89. ////////////////////////////////////////////////////////////////
  90.  
  91. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // zegar dla portu GPIO z którego wykorzystany zostanie pin jako wyjście DAC (PA4)
  92. RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); // zegar dla modułu DAC
  93. DAC_InitTypeDef DAC_InitStructure;
  94. //wyłączenie zewnętrznego wyzwalania
  95. //konwersja może być wyzwalana timerem, stanem wejścia itd. (szczegóły w dokumentacji)
  96. DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
  97. //nast. 2 linie - wyłączamy generator predefiniowanych przebiegów //wyjściowych (wartości zadajemy sami, za pomocą odpowiedniej funkcji)
  98. DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
  99. DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
  100. //włączamy buforowanie sygnału wyjściowego
  101. DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
  102. DAC_Init(DAC_Channel_1, &DAC_InitStructure);
  103. DAC_Cmd(DAC_Channel_1, ENABLE);
  104. //DAC_SetChannel1Data(DAC_Align_12b_R, 150); ///////////////////////
  105.  
  106. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  107. TIM_TimeBaseStructure.TIM_Period = 99; //99 dla zwiekszenia intestywnosci swiatla 9999 dla mrugania
  108. TIM_TimeBaseStructure.TIM_Prescaler = 83; //83 dla zwiekszenia intestywnosci swiatla 8399 dla mrugania
  109. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  110. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  111. TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  112.  
  113. TIM_OCInitTypeDef TIM_OCInitStructure;
  114. /* PWM1 Mode configuration: */
  115. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  116. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  117. TIM_OCInitStructure.TIM_Pulse = 0;
  118. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  119.  
  120. TIM_OC1Init(TIM4, &TIM_OCInitStructure);
  121. TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
  122.  
  123. TIM_OCInitTypeDef TIM_OCInitStructure2;
  124. /* PWM1 Mode configuration: */
  125. TIM_OCInitStructure2.TIM_OCMode = TIM_OCMode_PWM1;
  126. TIM_OCInitStructure2.TIM_OutputState = TIM_OutputState_Enable;
  127. TIM_OCInitStructure2.TIM_Pulse = 0;
  128. TIM_OCInitStructure2.TIM_OCPolarity = TIM_OCPolarity_High;
  129. TIM_OC2Init(TIM4, &TIM_OCInitStructure2);
  130. TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
  131.  
  132. TIM_OCInitTypeDef TIM_OCInitStructure3;
  133. /* PWM1 Mode configuration: */
  134. TIM_OCInitStructure3.TIM_OCMode = TIM_OCMode_PWM1;
  135. TIM_OCInitStructure3.TIM_OutputState = TIM_OutputState_Enable;
  136. TIM_OCInitStructure3.TIM_Pulse = 0;
  137. TIM_OCInitStructure3.TIM_OCPolarity = TIM_OCPolarity_High;
  138. TIM_OC3Init(TIM4, &TIM_OCInitStructure3);
  139. TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
  140.  
  141. TIM_OCInitTypeDef TIM_OCInitStructure4;
  142. /* PWM1 Mode configuration: */
  143. TIM_OCInitStructure4.TIM_OCMode = TIM_OCMode_PWM1;
  144. TIM_OCInitStructure4.TIM_OutputState = TIM_OutputState_Enable;
  145. TIM_OCInitStructure4.TIM_Pulse = 0;
  146. TIM_OCInitStructure4.TIM_OCPolarity = TIM_OCPolarity_High;
  147. TIM_OC4Init(TIM4, &TIM_OCInitStructure4);
  148. TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
  149.  
  150. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); ///1hz
  151. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure2;
  152. TIM_TimeBaseStructure2.TIM_Period = 9;
  153. TIM_TimeBaseStructure2.TIM_Prescaler = 8399;
  154. TIM_TimeBaseStructure2.TIM_ClockDivision = TIM_CKD_DIV1;
  155. TIM_TimeBaseStructure2.TIM_CounterMode = TIM_CounterMode_Up;
  156. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure2);
  157.  
  158. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  159. NVIC_InitTypeDef NVIC_InitStructure;
  160. // numer przerwania
  161. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  162. // priorytet główny
  163. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
  164. // subpriorytet
  165. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  166. // uruchom dany kanał
  167. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  168. // zapisz wypełnioną strukturę do rejestrów
  169. NVIC_Init(&NVIC_InitStructure);
  170.  
  171. TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  172. TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
  173. TIM_Cmd(TIM3, ENABLE);
  174. TIM_Cmd(TIM4, ENABLE);
  175.  
  176. TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
  177. TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
  178. GPIO_InitTypeDef GPIO_InitStructure;
  179. /* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */
  180. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14
  181. | GPIO_Pin_15;
  182. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  183. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  184. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  185. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  186. GPIO_Init( GPIOD, &GPIO_InitStructure);
  187.  
  188. unsigned int i;
  189. while (1) {
  190. TIM4->CCR1 = sinus / 100 - 5;
  191. TIM4->CCR2 = sinus / 100 - 5;
  192. TIM4->CCR3 = sinus / 100 - 5;
  193. TIM4->CCR4 = sinus / 100 - 5;
  194. }
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement