Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.34 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include "stm32f30x.h"
  4.  
  5. float risultato;
  6. float LUT[100];
  7.  
  8. float dato[100];
  9.  
  10. void salvaSuFile() {
  11. // per usare i file, bisogna configurare il progetto: Options >> General options >> library configuration >> seleziona Full
  12. FILE* file;
  13.  
  14. file = fopen("prova.txt", "a");
  15. for(int i = 0; i < 100; i++) {
  16. fprintf(file, "%.6f\n", dato[i]);
  17. }
  18. fclose(file);
  19. }
  20.  
  21. void popolaLUT() {
  22. /*
  23. per generare una sinus. di un dato periodo:
  24. 1. calcoliamo delta T (= tempo di generazione = tempo tra un campione e il successivo)
  25. = periodo / numero di campioni
  26. 2. TIM->ARR = T * fck (fck == 8 M oppure 72 M a seconda)
  27. 3. DHR12R1 = LUT[indiceLUT++ % 100];
  28. 4. ADSTART = 1;
  29. */
  30. float dx, x;
  31.  
  32. dx = 2 * 3.1415 / 100;
  33. for(int i = 0; i < 100; i++) {
  34. // è 1.5 perché così il valore sta a metà strada rispetto al F.S.
  35. LUT[i] = (1.5 + 1.5 * sin(x)) * 4095 / 3.0;
  36. x += dx;
  37. }
  38. }
  39.  
  40.  
  41. void setup_DAC() {
  42. RCC->APB1ENR |= RCC_APB1ENR_DACEN;
  43.  
  44. DAC->CR |= DAC_CR_EN1;
  45.  
  46. int volt = 2;
  47. int codice = 4095 * volt / 3;
  48. DAC->DHR12R1 = codice;
  49. for(int i = 0; i < 16; i++);
  50. }
  51. void setup_ADC() {
  52. RCC->AHBENR |= RCC_AHBENR_ADC12EN;
  53. ADC1_2->CCR |= ADC12_CCR_CKMODE_0;
  54. ADC1->CR &= ~ADC_CR_ADVREGEN;
  55. ADC1->CR &= ~ADC_CR_ADVREGEN;
  56.  
  57. for(int i = 0; i < 80000; i++);
  58.  
  59. ADC1->CR |= ADC_CR_ADCAL;
  60. while((ADC1->CR & ADC_CR_ADCAL) == ADC_CR_ADCAL);
  61.  
  62. ADC1->CR |= ADC_CR_ADEN;
  63.  
  64. while((ADC1->ISR & ADC_ISR_ADRD) != ADC_ISR_ADRD);
  65.  
  66. ADC1->CFGR &= ~ADC_CFGR_CONT;
  67. ADC1->SQR1 |= ADC_SQR1_SQ1_0 | ADC_SQR1_SQ1_1;
  68. ADC1->SQR1 &= ~ADC_SQR1_L;
  69. ADC1->SMPR1 |= ADC_SMPR1_SMP3;
  70. }
  71.  
  72. void setup_TIM() {
  73. RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
  74. TIM2->ARR = 8000;
  75. TIM2->CR2 = TIM_CR2_MMS_1;
  76. }
  77.  
  78. void main (void){
  79. RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
  80. GPIOA->MODER |= GPIO_MODER_MODER4 | GPIO_MODER_MODER2;
  81. setup_DAC();
  82. setup_ADC();
  83. setup_TIM();
  84. popolaLUT();
  85. TIM2->CNT = 0;
  86. TIM2->CR1 = TIM_CR1_CEN;
  87.  
  88. for(int i = 0; i < 100; i++) {
  89. DAC->DHR12R1 = LUT[i];
  90. while((TIM2->SR & TIM_SR_UIF) != TIM_SR_UIF);
  91. TIM2->SR &= ~TIM_SR_UIF;
  92. for(int j = 0; j < 1000; j++);
  93.  
  94. ADC1->CR |= ADC_CR_ADSTART;
  95. while((ADC1->ISR & ADC_ISR_EOC) != ADC_ISR_EOC);
  96. dato[i] = ADC1->DR;
  97. }
  98. salvaSuFile();
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement