找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1499|回复: 2
收起左侧

这个STM32程序怎么理解,NPT后面的数值是什么意思?

[复制链接]
回帖奖励 150 黑币 回复本帖可获得 5 黑币奖励! 每人限 5 次
ID:889175 发表于 2021-5-12 10:53 来自手机 | 显示全部楼层 |阅读模式
  1. include "led.h"
  2. #include "key.h"
  3. //#include "beep.h"
  4. //#include "exti.h"
  5. //#include "time.h"
  6. #include "lcd.h"
  7. #include "adc.h"
  8. #include "dac.h"
  9. #include "delay.h"
  10. #include "sys.h"
  11. #include "usart.h"
  12. #include "stm32_dsp.h"
  13. #include "table_fft.h"
  14. #include "math.h"
  15. #define NPT 1024                                   //#define PI2 6.28318530717959
  16. u8 Square_table[256]={        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,        255,255,255,255,255,255,255,255,        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,        1,1,1,1,1,1,1,1,};
  17. u8 Sin_table[256]= {        128,131,134,137,140,143,146,149,152,155,158,162,165,167,170,173,176,179,182,185,188,        190,193,196,198,201,203,206,208,211,213,215,218,220,222,224,226,228,230,232,234,235,        237,238,240,241,243,244,245,246,248,249,250,250,251,252,253,253,254,254,254,255,255,        255,255,255,255,255,254,254,254,253,253,252,251,250,250,249,248,246,245,244,243,241,        240,238,237,235,234,232,230,228,226,224,222,220,218,215,213,211,208,206,203,201,198,        196,193,190,188,185,182,179,176,173,170,167,165,162,158,155,152,149,146,143,140,137,        134,131,128,124,121,118,115,112,109,106,103,100,97,93,90,88,85,82,79,76,73,70,67,65,        62,59,57,54,52,49,47,44,42,40,37,35,33,31,29,27,25,23,21,20,18,17,15,14,12,11,10,9,        7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,17,18,20,        21,23,25,27,29,31,33,35,37,40,42,44,47,49,52,54,57,59,62,65,67,70,73,76,79,82,85,88,        90,93,97,100,103,106,109,112,115,118,121,124,};
  18. u8 Triangle_table[256]={        0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,        58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,        110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,        152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,        194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,        236,238,240,242,244,246,248,250,252,254,254,252,250,248,246,244,242,240,238,236,234,        232,230,228,226,224,222,220,218,216,214,212,210,208,206,204,202,200,198,196,194,192,        190,188,186,184,182,180,178,176,174,172,170,168,166,164,162,160,158,156,154,152,150,        148,146,144,142,140,138,136,134,132,130,128,126,124,122,120,118,116,114,112,110,108,        106,104,102,100,98,96,94,92,90,88,86,84,82,80,78,76,74,72,70,68,66,64,62,60,58,56,        54,52,50,48,46,44,42,40,38,36,34,32,30,28,26,24,22,20,18,16,14,12,10,8,6,4,2,0,};
  19. u16 i=0;
  20. u32 adcx[NPT];                                        //洢adc
  21. u32 adcmax = 0;                                        //
  22. u32 adcmin = 3300;                                //С
  23. u16 vpp = 0;                                        //
  24. int long fftin [NPT];                        //
  25. FFT
  26. int long fftout[NPT];                        //FFT
  27. u16 t = 0;                        //ж3
  28. u16 Set_T = 1000;        //TIM3
  29. u16 Show_T = 1;                //λKHZ
  30. u32 F = 0;                        //
  31. u16 U = 41;                        //u16 V = 660;                //λ660mv/div
  32. u16 get_v=0;                //
  33. u16 save_v=0;                //洢
  34. u8 flag=0;                        //
  35. u8 adc_flag=0;                //λ
  36. u8 clear_flag=1;        //Hold onλ0>Hold on
  37. u16 table[15] ={16,32,48,64,80,96,112,128,144,160,176,192,208,224,240};//X
  38. u16 h=0;                        //±
  39. u8 Wave_flag=1;                //
  40. u16 timeSet=39;                ////void lcd_huadian(u16 a,u16 b);
  41. void lcd_huaxian(u16 x1,u16 y1,u16 x2,u16 y2);
  42. void lcd_init(void);
  43. void clear_point(void);        
  44.          void InitBufInArray(void);
  45. void GetPowerMag(void);
  46. void EXTIX_Init(void);
  47. void TIM5_Init(u32 arr,u32 psc);
  48. void TIM3_Init(u16 arr,u16 psc);
  49. int main(void)
  50. {        Stm32_Clock_Init(9);                //        delay_init(72);                                //          uart_init(72,115200);        //// LED_Init();                                        //LED        
  51. LCD_Init();                                        //LCD//        
  52. BEEP_Init();                //IO        EXTIX_Init();                         //ж            ADC1_Init();                                        //ADC        
  53. Dac1_Init();        //721M,T*T1=1000                T=10001kHZ                TIM3        
  54.          TIM3_Init((Set_T-1),72-1);    //(10-1,71)100kHz  (1000-1,71)1kHz        //         TIM_Cmd(TIM3, ENABLE);        TIM5_Init(timeSet,71);        
  55. //        POINT_COLOR=RED;
  56. LCD_ShowString(60,40,210,24,24,"Elite STM32F1 ^_^"); LCD_ShowString(82,80,200,24,24,"ini OSC TEST");
  57. LCD_ShowString(107,120,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(117,145,200,16,16,"By AlphaZcc");
  58. LCD_ShowString(137,170,200,12,12,"2021/1/3");        
  59. delay_ms(1000);        
  60. LCD_Clear(WHITE);        
  61. lcd_init(); //        
  62. while(1)
  63. {                while(adc_flag == 0);                        //        adc_flag=0;                                        for(i=0;i<NPT;i++)                                //NPT1024maxmin        
  64.          {                        fftin[i] = 0;                        fftin[i] = adcx[i] << 16;                }                GetPowerMag();                adcmax=adcmax*0.80586;adcmin=adcmin*0.80586;           //0.8 = 3300/4095                LCD_ShowNum(275,115,adcmax,4,16);                LCD_ShowNum(275,150,adcmin,4,16);                vpp=adcmax-adcmin;                LCD_ShowNum(275,80,vpp,4,16);                                //                                clear_point();    //                                                                LED0=!LED0;                        TIM3->CR1|=0x01;    //3
  65.                                         adcmax = 0;        adcmin = 3300;                                        ////                delay_ms(1);                } }
  66. void lcd_init(void)
  67. {        POINT_COLOR=RED;                LCD_ShowString(15,8,200,24,24,"Mini_OSC");                LCD_ShowString(140,15,200,16,16,"INPUT:PA1");        LCD_ShowString(260,28,200,16,16,"mV/div:");                ///        LCD_ShowString(260,63,200,16,16,"vpp/mv:");                ///        LCD_ShowString(260,98,200,16,16,"max/mv:");                //        LCD_ShowString(260,133,200,16,16,"min/mv:");        //        LCD_ShowString(260,168,200,16,16,"f/Hz:");                ///Hz        LCD_ShowString(260,203,200,16,16,"OSR:");  //        
  68. POINT_COLOR=BLUE;        lcd_huaxian(0,0,0,200);                                //4        lcd_huaxian(256,0,256,200);        lcd_huaxian(0,0,256,0);                        lcd_huaxian(0,200,256,200);        POINT_COLOR=BLUE;                        LCD_ShowString(291,220,120,16,16,"kHz");                LCD_ShowString(268,8,200,16,16,"WORK");        LCD_ShowNum(265,220,Show_T,3,16);                //β        
  69. LCD_ShowNum(275,45,V,4,16);                                //λ660mv/div}
  70. void clear_point(void)//{        u16 x=0,i=0;        
  71.          for(x=0;x<NPT/4 && clear_flag;x++)
  72.         {                        POINT_COLOR=WHITE;
  73.                         lcd_huaxian(x  ,1,x  ,199);                //                POINT_COLOR=BLUE;                lcd_huaxian(0,0,0,200);                        //                lcd_huadian(x,100);                                //                                                if(x == table[h])                                //С        
  74.          {                        lcd_huaxian(x,1,x,3);                        lcd_huaxian(x,101,x,103);                        lcd_huaxian(x,199,x,197);
  75.                         h++;        
  76.                  if(h>=16) h=0;                }        
  77.                  if(x==128) //        
  78.          {                        lcd_huaxian(x,1,x,199);                        for(i=20;i<200;i+=20)        
  79.                  {                                lcd_huaxian(125,i,127,i);                        }                }        
  80.                                          get_v = adcx[x]/U+(90-((adcmax-adcmin)/(2*U)));
  81.                 //                lcd_huadian(x,get_v);                                        //                lcd_huaxian(x,save_v,x+1,get_v);                //                save_v = get_v;                                                        //洢//      delay_ms(10);                }}/******************************************************************:GetPowerMag():г::lBufOutArray(X)鲿(Y)(sqrt(X*X+Y*Y)*******************************************************************/
  82. void GetPowerMag(void)
  83. {        u16 temp = 0;    float X,Y,Mag;
  84.         float magmax=0;    unsigned short i;        magmax=0;        
  85. //cr4_fft_1024_stm32        cr4_fft_1024_stm32(fftout, fftin, NPT);            for(i=1; i<NPT/2; i++)
  86.    {        X  = (fftout[i] << 16) >> 16;      
  87. Y  = (fftout[i] >> 16);      
  88.   Mag = sqrt(X * X + Y * Y);   
  89.                  if(Mag > magmax)        
  90.          {                        magmax = Mag;                        temp = i;                }                                    }        if(Set_T==1000)        
  91.          F=(u32)((double)temp/NPT*1000  );                if(Set_T==100)
  92.                 F=(u32)((double)temp/NPT*10010 );        if(Set_T==10)        
  93.          F=(u32)((double)temp/NPT*100200);        
  94. if(Set_T==2)        
  95.          F=(u32)((double)temp/NPT*249760);                LCD_ShowNum(265,185,F,5,16);                }
  96. void lcd_huadian(u16 a,u16 b)                        //廭
  97. {                                                            LCD_Fast_DrawPoint(a,240-b,BLUE);}
  98. void lcd_huaxian(u16 x1,u16 y1,u16 x2,u16 y2)        //廭
  99. {        LCD_DrawLine(x1,240-y1,x2,240-y2);}//3ж        //                 void EXTIX_Init(void)
  100. {  EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;    KEY_Init();         //          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //ù    //GPIOE.2 жж     GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);  EXTI_InitStructure.EXTI_Line=EXTI_Line2;        //KEY2  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  EXTI_InitStructure.EXTI_LineCmd = ENABLE;  EXTI_Init(&EXTI_InitStructure);        //EXTI_InitStructEXTI   //GPIOE.3          жж  //KEY1  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);  EXTI_InitStructure.EXTI_Line=EXTI_Line3;  EXTI_Init(&EXTI_InitStructure);          //EXTI_InitStructEXTI   //GPIOE.4          жж          //KEY0  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);  EXTI_InitStructure.EXTI_Line=EXTI_Line4;  EXTI_Init(&EXTI_InitStructure);          //EXTI_InitStructEXTI   //GPIOA.0          жж  PA0  WK_UP  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);           EXTI_InitStructure.EXTI_Line=EXTI_Line0;  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  EXTI_Init(&EXTI_InitStructure);                //EXTI_InitStructEXTI  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                        //WK_UPж  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //2           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;                                        //3  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ж  NVIC_Init(&NVIC_InitStructure);     NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;                        //KEY2ж  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //2           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                                        //2  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ж  NVIC_Init(&NVIC_InitStructure);  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;                        //KEY1ж  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //2           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //1           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ж  NVIC_Init(&NVIC_InitStructure);    //NVIC_InitStructNVIC        NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;                        //KEY0ж  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //2           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //0           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ж  NVIC_Init(&NVIC_InitStructure);    //NVIC_InitStructNVIC }void TIM5_Init(u32 arr,u32 psc){   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;                NVIC_InitTypeDef NVIC_InitStructure;   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);//TIM4          TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//          TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//          TIM_TimeBaseStructure.TIM_Period=arr;//          TIM_TimeBaseStructure.TIM_Prescaler=psc;//          TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);          TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//ж          TIM_Cmd(TIM5,ENABLE);//4            TIM_SetCounter(TIM5, 0);   // CNT          NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;//4ж          NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0X00;          NVIC_InitStructure.NVIC_IRQChannelSubPriority=0X01;          NVIC_Init(&NVIC_InitStructure);
  101. }
  102. void TIM3_Init(u16 arr,u16 psc)
  103. {  
  104. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;        
  105.          NVIC_InitTypeDef NVIC_InitStructure;   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//TIM3          TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV2;//          TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//          TIM_TimeBaseStructure.TIM_Period=arr;//          TIM_TimeBaseStructure.TIM_Prescaler=psc;//                  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);          TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//ж          TIM_Cmd(TIM3,ENABLE);//3//          //          TIM_SetCounter(TIM3, 0);   // CNT          NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;//4ж          NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0X01;          NVIC_InitStructure.NVIC_IRQChannelSubPriority=0X00;          NVIC_Init(&NVIC_InitStructure);}//6ж
  106.          void TIM5_IRQHandler(void)
  107. {
  108. static u16 intr=0;        
  109. if(TIM5->SR&0X0001)                //ж
  110.         {                intr++;                if(intr==256)                        intr=0;        
  111.          switch (Wave_flag)
  112.                 {                        case 1:Dac1_Set_Vol(Square_table[intr]*12);                //DA                                break;
  113.                         case 2:Dac1_Set_Vol(Sin_table[intr]*12);                //DA                                break;        
  114.                  case 3:Dac1_Set_Vol(Triangle_table[intr]*12);        //DA                                break;                        default :                                break;                }        }                                 
  115.           TIM5->SR&=~(1<<0);        //жλ     }//ж0

  116. void EXTI0_IRQHandler(void){        delay_ms(10);        //        if(WK_UP==1)        //WK_UP        {                                if(Wave_flag==1)                        Wave_flag=2;        
  117.          else if(Wave_flag==2)                        Wave_flag=3;        
  118.          else if(Wave_flag==3)                        Wave_flag=1;                                while(WK_UP==1);        }                EXTI->PR=1<<0;  //LINE0жλ  }//ж2void EXTI2_IRQHandler(void)
  119. {        delay_ms(10);        //        if(KEY2==0)        //KEY2        {                if(timeSet==390)                        timeSet=156;        //25Hz                else if(timeSet==156)                        timeSet=78;                //50Hz                else if(timeSet==78)                        timeSet=39;                //100Hz                else if(timeSet==39)                        timeSet=26;                //150Hz                else if(timeSet==26)                        timeSet=19;                //200Hz                else if(timeSet==19)                                timeSet=390;        //50Hz                TIM6->ARR=timeSet;          while(KEY1==1);        }                EXTI->PR=1<<2;  //LINE2жλ  }

  120. void TIM3_IRQHandler(void)
  121. {
  122.   if(TIM3->SR&0X0001)//ж
  123.         {                adcx[t]=Get_Adc(ADC_Channel_1);                                //β//                adcx[t]=Get_Adc_Average(ADC_CH1,3);        
  124.          //β                                                if(adcx[t] >= adcmax)                adcmax = adcx[t];//                if(adcx[t] <= adcmin)                adcmin = adcx[t];        
  125.                          t++;        
  126.          if(t==NPT)
  127. {                        t=0;                        adc_flag = 1;                        TIM3->CR1 &= (uint16_t)(~((uint16_t)0x0001));//3                        }        }                                 
  128.           TIM3->SR&=~(1<<0);//жλ     }
  129. //ж3
  130. void EXTI3_IRQHandler(void)
  131. {        delay_ms(10);        //        
  132. if(KEY1==0)                 //KEY1
  133.         {                        if(clear_flag == 1)
  134.                 {        
  135.                  TIM3->CR1 &= (uint16_t)(~((uint16_t)0x0001));//3                                                                clear_flag=0;                        LCD_ShowString(268,8,200,16,16,"STOP  ");                                        }
  136.                 else                {                        TIM3->CR1|=0x01;    //3                                                        clear_flag=1;                        LCD_ShowString(268,8,200,16,16,"WORK");                }        
  137.          while(KEY1==0);        }        
  138.                   EXTI->PR=1<<3;  //LINE3жλ  }//ж4
  139. void EXTI4_IRQHandler(void)
  140. {        delay_ms(10);        //        if(KEY0==0)                 //KEY0        {                POINT_COLOR=BLUE;                                flag++;                if(flag==1)                {                        Set_T = 100;                        Show_T = 10;                }                else if(flag==2)                 {                        Set_T=10;                        Show_T = 100;                }
  141.                 else if(flag==3)                {                        Set_T=2;                        Show_T = 500;                }                else if(flag==4)                {                        Set_T=1000;                        Show_T = 1;                        flag=0;                }                LCD_ShowNum(265,220,Show_T,3,16);                                                                   TIM3->ARR=(Set_T-1);                          //趨                while(KEY0==0);
  142.         }        
  143. EXTI->PR=1<<4;                                          //LINE4жλ  }
  144. м
  145. 1 get_v = adcx[x]/U+(90-((adcmax-adcmin)/(2*U)));
  146. дadcд 320240
  147. 2DACDAC
  148. 3 :GetPowerMag()
  149.    X  = (fftout[i] << 16) >> 16;        
  150.    Y  = (fftout[i] >> 16);
  151. f(Set_T==1000)
  152. F=(u32)((double)temp/NPT*1000  );                if(Set_T==100)
  153. F=(u32)((double)temp/NPT*10010 );        if(Set_T==10)
  154. F=(u32)((double)temp/NPT*100200);        if(Set_T==2)               
  155. F=(u32)((double)temp/NPT*249760);
复制代码
回复

使用道具 举报

ID:889175 发表于 2021-5-12 11:25 | 显示全部楼层
字乱码了,问题是 get_v = adcx[x]/U+(90-((adcmax-adcmin)/(2*U)));
这行代码应该是把ADC的数值转换成屏幕坐标,正点原子的电阻屏320—240的

2——DAC怎么输出,除了输出那三个波形外没看到DAC输出函数。

3 :GetPowerMag()
   X  = (fftout[i] << 16) >> 16;        
   Y  = (fftout[i] >> 16);
f(Set_T==1000)
F=(u32)((double)temp/NPT*1000  );                if(Set_T==100)
F=(u32)((double)temp/NPT*10010 );        if(Set_T==10)
F=(u32)((double)temp/NPT*100200);        if(Set_T==2)               
F=(u32)((double)temp/NPT*249760);
怎么理解,NPT后面的数值是什么意思?
希望各位大佬帮帮忙。
回复

使用道具 举报

ID:1011394 发表于 2022-3-18 19:07 | 显示全部楼层
玄殇 发表于 2021-5-12 11:25
字乱码了,问题是 get_v = adcx[x]/U+(90-((adcmax-adcmin)/(2*U)));
这行代码应该是把ADC的数值转换成屏 ...

你好,我也有同样问题,你有答案了吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表