OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2602|回复: 3

基于STM32F100C的LCR测试表

[复制链接]

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2020-1-17 12:37:30 | 显示全部楼层 |阅读模式
本帖最后由 STM129 于 2020-10-18 18:52 编辑

链接:https://radiokot.ru/circuit/digital/measure/108/
有兴趣的来研究下其是什么个原理

图纸

图纸
05.jpg
07.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
 楼主| 发表于 2020-3-15 20:53:35 | 显示全部楼层
没人浏览,放上程序看有兴趣的不。一个模拟信号计算处理的程序。
  1. /* ------------------------------------------------------------------
  2. * 2013 RLC Meter V6 / Neekeetos@yahoo.com
  3. */

  4. #include "stm32f10x.h"
  5. #include "stm32f10x_tim.h"
  6. #include "stm32f10x_gpio.h"
  7. #include "stm32f10x_dac.h"
  8. #include "stm32f10x_dma.h"
  9. #include "stm32f10x_rcc.h"
  10. #include "string.h"
  11. #include "math.h"
  12. #include "misc.h"
  13. // #include "uart.h"
  14. #include "n1110.h"

  15. #define AIRCR_VECTKEY_MASK    ((uint32_t)0x05FA0000)

  16. #define N 500
  17. #define DAC_N (N/5)
  18. #define OSR 40
  19. #define SINE_OFFSET 900

  20. #define IRQ_ADC_SAMPLE 1
  21. #define IRQ_DAC_INVERSE 2
  22. #define IRQ_DAC_ZERO 4

  23. #define cordic_1K 0x26DCEDB0
  24. #define half_pi 0x40000000
  25. #define MUL 1073741824.000000
  26. #define CORDIC_NTAB 32

  27. #define ALPHA 0.05
  28. #define ALPHA2 0.1
  29. #define CLOSE_LIMIT 0.05
  30. #define FLT_LEN 5
  31. //#define MOHM_LIMIT 0.02
  32. //#define GOHM_LIMIT 1e6

  33. #define SHUNT 148.0
  34. #define CAL_ROUNDS 64

  35. #define PWR_PIN (GPIOC->IDR & GPIO_Pin_13)
  36. #define SP_PIN (GPIOB->IDR & GPIO_Pin_8)
  37. #define REL_PIN (GPIOB->IDR & GPIO_Pin_7)

  38. #define PWR_BTN 1
  39. #define SP_BTN 2
  40. #define REL_BTN 4

  41. #define PWR_BTNL 0x10
  42. #define SP_BTNL  0x20
  43. #define REL_BTNL 0x40

  44. #define PUSH_MSK 0x000003
  45. #define PUSH_MAP 0x000001
  46. #define LPUSH_MSK 0x00001FFF
  47. #define LPUSH_MAP 0x00000FFF

  48. int buttons();

  49. const uint32_t chn[3] ={1,2,7};
  50. const int dig[]= { 1000000000,100000000,10000000,1000000,100000,10000,1000,100,10,1};
  51. const char dp[9]= {'f','p','n','u','m',' ','k','M','G'};
  52. int cordic_ctab [] = {0x20000000, 0x12E4051E, 0x09FB385B, 0x051111D4, 0x028B0D43, 0x0145D7E1, 0x00A2F61E, 0x00517C55, 0x0028BE53, 0x00145F2F, 0x000A2F98, 0x000517CC,
  53. 0x00028BE6, 0x000145F3, 0x0000A2FA, 0x0000517D, 0x000028BE, 0x0000145F, 0x00000A30, 0x00000518, 0x0000028C, 0x00000146, 0x000000A3, 0x00000051, 0x00000029, 0x00000014,
  54. 0x0000000A, 0x00000005, 0x00000003, 0x00000001, 0x00000001, 0x00000000, };

  55. volatile uint32_t irq_request = 0;
  56. volatile uint32_t irq_status = 0;

  57. int16_t sine[N+N/4];
  58. uint32_t dac_buf[DAC_N];

  59. #define FCNT 5

  60. const int flist[FCNT]= { 1,9,25,49,97 };
  61. int __attribute__ ((section (".noinit"))) findex,cstatus;

  62. volatile uint32_t ch = 0;
  63. int freq;
  64. //----------------------------------------------------------------------------
  65. typedef struct complex_number {
  66.         float Re;
  67.         float Im;
  68. } cplx;
  69. //----------------------------------------------------------------------------
  70. cplx mData[3];
  71. cplx mAcc[3];

  72. volatile uint16_t adc_dma[N];

  73. cplx __attribute__ ((section (".noinit"))) Zo[FCNT];
  74. cplx __attribute__ ((section (".noinit"))) Zs[FCNT];// calibration constants
  75. cplx R;
  76. //----------------------------------------------------------------------------
  77. // res = res / div
  78. //----------------------------------------------------------------------------
  79. void cplxDiv(cplx * res, cplx * div)
  80. {
  81.         cplx tmp;
  82.         float mod2 = div->Re*div->Re + div->Im*div->Im;

  83.         tmp.Re =  ( res->Re * div->Re + res->Im * div->Im ) / mod2;        //(a*c+b*d)/(c*c+d*d);
  84.         tmp.Im =  ( res->Im * div->Re - res->Re * div->Im ) / mod2; //(b*c-a*d)/(c*c+d*d);
  85.         res->Re = tmp.Re;
  86.         res->Im = tmp.Im;
  87. }
  88. //----------------------------------------------------------------------------
  89. // res = res * mul
  90. //----------------------------------------------------------------------------
  91. void cplxMul(cplx * res, cplx * mul)
  92. {
  93.         cplx tmp;
  94.         tmp.Re =  ( res->Re * mul->Re - res->Im * mul->Im );// a*c - b*d
  95.         tmp.Im =  ( res->Re * mul->Im + res->Im * mul->Re );// a*d + b*c
  96.         res->Re = tmp.Re;
  97.         res->Im = tmp.Im;
  98. }
  99. //----------------------------------------------------------------------------
  100. int cordic(int theta)
  101. {
  102.         int k, tx, ty;
  103.         int x=cordic_1K,y=0,z=theta;

  104.         if( ( z >= half_pi ) || ( z < -half_pi) ) z = (half_pi<<1) - z;

  105.         //n = (n>CORDIC_NTAB) ? CORDIC_NTAB : n;

  106.         for ( k = 0 ; k < 20; ++k ) // 20bit
  107.         {
  108.                 if(z >= 0 )
  109.                 {
  110.                         tx = x -  (y>>k) ;
  111.                         ty = y +  (x>>k) ;
  112.                         z = z -  cordic_ctab[k];
  113.                         x = tx; y = ty;
  114.                 }else{
  115.                         tx = x +  (y>>k) ;
  116.                         ty = y -  (x>>k) ;
  117.                         z = z +  cordic_ctab[k];
  118.                         x = tx; y = ty;
  119.                 }
  120.         }
  121.         return (y);
  122.         //*c = x; *s = y;
  123. }
  124. //----------------------------------------------------------------------------
  125. void fillSine(int freq)
  126. {   int s,i;
  127. long long pp;
  128. for(i=0;i<N;i++)
  129. {
  130.         pp = ( ((long long )freq * i << 32 ) / N );//<<16;
  131.         s = cordic((int)pp);
  132.         s = ((s>>14)+1)>>1;
  133.         sine[i] = s;
  134. }

  135. for(i=0;i<N/4;i++)
  136. {
  137.         pp = ( ((long long )freq * i << 32 ) / N );
  138.         s = cordic((int)pp);
  139.         s = ((s>>14)+1)>>1;
  140.         sine[i+N] = s;
  141. }

  142. }
  143. //----------------------------------------------------------------------------
  144. float absolute(float x)
  145. {
  146.         if (x < 0) return (-x);
  147.         return (x);
  148. }
  149. //----------------------------------------------------------------------------
  150. float square(float x) {
  151.         float guess = 1;
  152.         int lim = 100;

  153.         while( (absolute(guess*guess - x) >= 0.000002 )&&(lim-- >0))
  154.                 guess = ((x/guess) + guess) * 0.5;

  155.         return (guess);
  156. }
  157. //----------------------------------------------------------------------------
  158. void  __attribute__ ((noinline)) print(char * str){
  159.         lcd_putstr(str);
  160.         //        uart_tx(str,1);// wait
  161. }
  162. //----------------------------------------------------------------------------
  163. void puthex(int inp,short size)
  164. {
  165.         char buf[9];
  166.         int j;

  167.         for(j=size-1;j>=0;j--)
  168.         {char dig = (inp&0xf);
  169.         if(dig<10){buf[j]=0x30+dig;}else{buf[j]=0x41+dig-10;}
  170.         inp >>=4;
  171.         }

  172.         buf[size]=0;
  173.         print(buf);
  174. }
  175. //----------------------------------------------------------------------------
  176. void sputdec(char * buf,int inp)
  177. {
  178.         int ptr = 0;
  179.         int s,startflag = 1;
  180.         int digit;


  181.         for(ptr =0;ptr < 12; ptr++)        buf[ptr]=0;
  182.         ptr = 0;

  183.         if(inp<0 ){inp = -inp;buf[ptr++]='-';}

  184.         for(s = 0;s<10;s++)
  185.         {
  186.                 digit =0;
  187.                 while (inp >= dig[s]){inp-=dig[s];digit++;}

  188.                 if(digit != 0) startflag =0;
  189.                 if(s == 9 )startflag =0;
  190.                 if( startflag == 0 ) buf[ptr++]=0x30+digit;

  191.         }

  192.         return;
  193. }
  194. //----------------------------------------------------------------------------
  195. void putdec(int inp)
  196. {
  197.         char buf[12];
  198.         sputdec(buf,inp);
  199.         print(buf);
  200. }
  201. //----------------------------------------------------------------------------
  202. void  printFloat(int x , int y,float num,char * suffix)
  203. {
  204.         char out[20];
  205.         char nnn[20];
  206.         int i,dot;

  207.         out[0] = ' ';
  208.         if(num < 0 ) { num = -num;out[0]= '-';}
  209.         if(num > 1e10) num = 1e10;
  210.         if(num < 1e-15) num = 1e-15;

  211.         int exp = 19;

  212.         if(num < 10000.0)
  213.         {
  214.                 while(num < 10000.0){ num*= 10.0; exp--;        }
  215.         }else{
  216.                 while(num > 99999.4){ num/= 10.0; exp++;        }
  217.         }

  218.         dot = (exp+30)%3;
  219.         exp = (exp)/3;

  220.         if(exp <0 || exp> 8 )
  221.         {
  222.                 for(i = 0; i<6;i++)
  223.                 {
  224.                         out[i+1] = '-';
  225.                 }
  226.         }else{

  227.                 sputdec(nnn,num+0.5);

  228.                 char * optr = &out[1];
  229.                 for(i = 0; i<6;i++)
  230.                 {
  231.                         *optr++ = nnn[i];
  232.                         if(i==dot){ *optr++  = '.'; }
  233.                 }
  234.         }

  235.         out[7] = dp[exp];

  236.         for(i = 0; i<6;i++)
  237.         {
  238.                 if(suffix[i]== 0 ){out[i+8] = 0;break;}
  239.                 out[i+8] = suffix[i];
  240.         }

  241.         lcd_putnum (x,y,out);
  242. }
  243. //----------------------------------------------------------------------------
  244. void runRound(void) // result in real[3],imag[3]
  245. {
  246.         //                GPIOB->BSRR = GPIO_Pin_14;
  247.         irq_request |= IRQ_ADC_SAMPLE;
  248.         while( !(irq_status & IRQ_ADC_SAMPLE) ) __NOP();__NOP();
  249.         irq_status &= ~IRQ_ADC_SAMPLE;
  250.         //                GPIOB->BRR = GPIO_Pin_14; // reset
  251. }
  252. //----------------------------------------------------------------------------
  253. void measure(cplx * Z , int rounds)
  254. {

  255.         cplx I;

  256.         mAcc[0].Re = 0;mAcc[0].Im = 0;
  257.         mAcc[1].Re = 0;mAcc[1].Im = 0;
  258.         mAcc[2].Re = 0;mAcc[2].Im = 0;

  259.         while(rounds-- >0 )
  260.         {
  261.                 runRound();
  262.                 mAcc[0].Re += mData[0].Re;
  263.                 mAcc[0].Im += mData[0].Im;
  264.                 mAcc[1].Re += mData[1].Re;
  265.                 mAcc[1].Im += mData[1].Im;
  266.                 mAcc[2].Re += mData[2].Re;
  267.                 mAcc[2].Im += mData[2].Im;

  268.         }

  269.         Z->Re = (mAcc[2].Re - mAcc[0].Re); // V
  270.         Z->Im = (mAcc[2].Im - mAcc[0].Im);
  271.         cplxMul(Z,&R);
  272.         I.Re = (mAcc[0].Re - mAcc[1].Re); // I
  273.         I.Im = (mAcc[0].Im - mAcc[1].Im);
  274.         cplxDiv(Z,&I);

  275. }
  276. //----------------------------------------------------------------------------
  277. float filter(int sidx,float new)
  278. {
  279.         static float state[10];
  280.         static int cnt[10];

  281.         float t = (state[sidx]-new);
  282.         float sc = CLOSE_LIMIT*state[sidx];

  283.         if( (t > sc) || ( t < -sc ) )
  284.         {
  285.                 if(t > 0 )cnt[sidx]++; else  cnt[sidx]--;
  286.                 state[sidx] = state[sidx]*(1-ALPHA2)+ new*ALPHA2;
  287.         }else{
  288.                 state[sidx] = state[sidx]*(1-ALPHA)+ new*ALPHA;
  289.                 if(t < 0 )cnt[sidx]++; else  cnt[sidx]--;
  290.         }

  291.         if( (cnt[sidx] > 2*FLT_LEN) || (cnt[sidx] < -2*FLT_LEN) )
  292.         {
  293.                 state[sidx] = new;
  294.                 cnt[sidx] = 0;
  295.                 //if(cnt[sidx]  > 0 ) cnt[sidx] = FLT_LEN; else cnt[sidx] =  -FLT_LEN;
  296.         }


  297.         return state[sidx];
  298. }
  299. //----------------------------------------------------------------------------
  300. void powerOff(void)
  301. {
  302.         int cnt =0;

  303.         AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI13_PC;
  304.         EXTI->FTSR = EXTI_FTSR_TR13;
  305.         EXTI->IMR = 0;
  306.         EXTI->EMR = EXTI_EMR_MR13;
  307.         EXTI->PR = 0x0003FFFF;

  308.         DAC->CR  =0;
  309.         ADC1->CR2 =0;
  310.         GPIOA->CRH &= ~(
  311.                         GPIO_CRH_CNF9 |GPIO_CRH_MODE9 // usart tx
  312.                         |GPIO_CRH_CNF10|GPIO_CRH_MODE10 // usart rx
  313.         );

  314.         lcd_write(COMMAND, 0xA5); // DAL
  315.         lcd_write(COMMAND, 0xAE); // turn off display


  316.         GPIOA->BSRR = GPIO_Pin_3; // ANALOG OFF
  317.         GPIOA->BRR = GPIO_Pin_15; // BACKLIGHT OFF

  318.         SCB->SCR |= SCB_SCR_SLEEPDEEP;
  319.         PWR->CR &= ~(PWR_CR_PDDS|PWR_CR_LPDS);
  320.         PWR->CR |= PWR_CR_LPDS;

  321.         while( !(GPIOC->IDR & GPIO_Pin_13) ) ;

  322.         while(cnt <400000)
  323.         {
  324.                 if( !(GPIOC->IDR & GPIO_Pin_13) )cnt++;
  325.                 else
  326.                 {
  327.                         if(cnt>0)cnt = 0; else cnt--;
  328.                         if(cnt<-100){        EXTI->PR = 0x0003FFFF;__NOP();        __WFE(); }
  329.                 }
  330.         }
  331.         NVIC_SystemReset();

  332.         //GPIOA->BSRR = GPIO_Pin_15; // BACKLIGHT ON

  333. }
  334. //----------------------------------------------------------------------------
  335. void waitz(float lim)
  336. {
  337.         float min = -lim , max = lim;
  338.         float z;
  339.         cplx Z;

  340.         if(lim < 0 ) // minimum
  341.         {
  342.                 z = min * 2;
  343.                 while( z > min )
  344.                 {
  345.                         measure(&Z,1);
  346.                         z = absolute(Z.Re);
  347.                         if( buttons() & PWR_BTN  ) powerOff();
  348.                 }

  349.         }else{
  350.                 z = 0;
  351.                 while( z < max*max )
  352.                 {
  353.                         measure(&Z,1);
  354.                         z = (Z.Re*Z.Re+Z.Im*Z.Im);
  355.                         if( buttons() & PWR_BTN  ) powerOff();
  356.                 }
  357.         }

  358. }
  359. //----------------------------------------------------------------------------
  360. void calibrate( void ){
  361.         cplx Z;
  362.         irq_request &= ~IRQ_DAC_INVERSE; // normal out

  363.         lcd_gotoxy(0, 0);print("Open leads      ");        waitz(1000);

  364.         measure(&Z,6);
  365.         lcd_gotoxy(0, 0);print("Open cal        ");
  366.         measure(&Zo[findex],CAL_ROUNDS);

  367.         lcd_gotoxy(0, 0);print("Close leads      ");waitz(-1);

  368.         measure(&Z,6);
  369.         lcd_gotoxy(0, 0);print("Short cal        ");

  370.         measure(&Zs[findex],CAL_ROUNDS);
  371. }
  372. //----------------------------------------------------------------------------
  373. int buttons()
  374. {
  375.         int out = 0;
  376.         static unsigned int sPWR = 0;
  377.         static unsigned int sSP = 0;
  378.         static unsigned int sREL = 0;

  379.         sPWR<<=1;sSP<<=1;sREL<<=1;
  380.         sPWR &=0xFFFFF;        sSP &=0xFFFFF;        sREL &=0xFFFFF;
  381.         if( !PWR_PIN ) { sPWR |= 1;}
  382.         if( !SP_PIN )  { sSP  |= 1;}
  383.         if( !REL_PIN ) { sREL |= 1;}

  384.         if( (sPWR&PUSH_MSK) == PUSH_MAP ) {out|= PWR_BTN;}
  385.         if( (sSP& PUSH_MSK) == PUSH_MAP ) {out|= SP_BTN;}
  386.         if( (sREL&PUSH_MSK) == PUSH_MAP ) {out|= REL_BTN;}

  387.         if( (sPWR&LPUSH_MSK) == LPUSH_MAP ) out|= PWR_BTNL;
  388.         if( (sSP &LPUSH_MSK) == LPUSH_MAP ) out|= SP_BTNL;
  389.         if( (sREL&LPUSH_MSK) == LPUSH_MAP ) out|= REL_BTNL;

  390.         return (out);
  391. }
  392. //----------------------------------------------------------------------------
  393. int main(void) {
  394.         int bl_status = 1,rsrp = 0,rel = 0,btn,round = 0;
  395.         cplx Z,base;
  396.         char s[16];

  397.         RCC->CFGR &= ~RCC_CFGR_ADCPRE;
  398.         RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2;// 16M adc

  399.         RCC->AHBENR |= RCC_AHBENR_DMA1EN;
  400.         RCC->APB1ENR = RCC_APB1ENR_TIM2EN| RCC_APB1ENR_TIM3EN | RCC_APB1ENR_DACEN | RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN;
  401.         RCC->APB2ENR = RCC_APB2ENR_ADC1EN        |RCC_APB2ENR_IOPAEN        |RCC_APB2ENR_IOPBEN        |RCC_APB2ENR_IOPCEN                //|RCC_APB2ENR_USART1EN
  402.                         |RCC_APB2ENR_AFIOEN;

  403.         AFIO->MAPR = AFIO_MAPR_TIM2_REMAP_FULLREMAP|AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
  404.         SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup_1;

  405.         NVIC_SetPriority(DMA1_Channel1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),1,1));//adc
  406.         NVIC_SetPriority(DMA1_Channel4_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0,0));//dac

  407.         GPIOA->CRL = GPIO_CRL_MODE3_1 // analog switch
  408.                         ;
  409.         GPIOA->CRH =
  410.                         GPIO_CRH_CNF10_0 //usart rx
  411.                         |GPIO_CRH_CNF9_1|GPIO_CRH_MODE9_1 // usart tx
  412.                         |GPIO_CRH_MODE15_1 // backlight
  413.                         ;
  414.         //        |GPIO_CRH_CNF15_1|GPIO_CRH_MODE15_1 // TIM2 CH1
  415.         // MCO : |GPIO_CRH_MODE8_0|GPIO_CRH_CNF8_1        RCC->CFGR |= RCC_CFGR_MCO_SYSCLK;

  416.         GPIOA->BRR = GPIO_Pin_0; // GUARD ON
  417.         GPIOA->BRR = GPIO_Pin_3; // ANALOG ON
  418.         GPIOA->BRR = GPIO_Pin_15; // BACKLIGHT OFF

  419.         GPIOB->CRL =
  420.                         GPIO_CRL_CNF7_1  // BUTTON 1 PU
  421.                         |GPIO_CRL_MODE3 //SCK
  422.                         |GPIO_CRL_MODE4 //MOSI
  423.                         |GPIO_CRL_MODE5 // CS
  424.                         |GPIO_CRL_MODE6 //RES
  425.                         ;
  426.         GPIOB->CRH =
  427.                         GPIO_CRH_CNF8_1 // BUTTON 2
  428.                         |GPIO_CRH_MODE13_1 // diag 1
  429.                         |GPIO_CRH_MODE14_1 // diag 2
  430.                         ;

  431.         GPIOB->BSRR = GPIO_Pin_8| GPIO_Pin_7; // BUTTON 1,2 PU
  432.         GPIOB->BRR = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6
  433.                         |GPIO_Pin_13|GPIO_Pin_14;// 0 diag 1,2 outputs

  434.         GPIOC->CRL = 0;
  435.         GPIOC->CRH = GPIO_CRH_CNF13_1;//GPIO_CRH_CNF13_1; // BUTTON 3
  436.         GPIOC->BSRR = GPIO_Pin_13;// BUTTON 3 PU

  437.         TIM2->PSC = 0;
  438.         TIM2->ARR = 63;///63;
  439.         TIM2->CR1 = TIM_CR1_ARPE;
  440.         TIM2->CR2 = TIM_CR2_MMS_2|TIM_CR2_MMS_1; // TRGO trigger = oc3  = DAC TRIGGER
  441.         TIM2->CCR1 = 46;
  442.         TIM2->CCR2 = 62;
  443.         TIM2->CCR3 = 10;
  444.         TIM2->CCR4 = 0;
  445.         TIM2->SMCR = 0;
  446.         TIM2->CCMR1 = TIM_CCMR1_OC1M | TIM_CCMR1_OC1PE|TIM_CCMR1_OC2M | TIM_CCMR1_OC2PE;
  447.         TIM2->CCMR2 = TIM_CCMR2_OC3M | TIM_CCMR2_OC3PE;//|TIM_CCMR2_OC4M | TIM_CCMR2_OC4PE;
  448.         TIM2->CCER =  TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E ;
  449.         TIM2->DIER =  TIM_DIER_CC1DE;
  450.         TIM2->EGR = 0;

  451.         DAC->CR  = DAC_CR_TEN1|DAC_CR_TEN2|DAC_CR_TSEL2_2|DAC_CR_TSEL1_2  //tim2_trgo
  452.                         |DAC_CR_BOFF1|DAC_CR_BOFF2
  453.                         |DAC_CR_WAVE1_1|DAC_CR_MAMP1_1|DAC_CR_MAMP1_0
  454.                         |DAC_CR_WAVE2_1|DAC_CR_MAMP2_1|DAC_CR_MAMP2_0
  455.                         ;

  456.         DMA1_Channel4->CCR = 0;
  457.         DMA1_Channel4->CPAR = (uint32_t)&DAC->DHR12RD;
  458.         DMA1_Channel4->CMAR = (uint32_t) dac_buf;//sine;
  459.         DMA1_Channel4->CNDTR = DAC_N;
  460.         DMA1_Channel4->CCR = DMA_CCR1_MINC | DMA_CCR1_CIRC | DMA_CCR1_DIR |DMA_CCR1_PL_1|
  461.                         DMA_MemoryDataSize_Word| DMA_PeripheralDataSize_Word
  462.                         |DMA_CCR1_HTIE        |DMA_CCR1_TCIE        ;
  463.         DMA1_Channel4->CCR |= DMA_CCR1_EN;

  464.         DMA1_Channel1->CCR = 0;
  465.         DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR;
  466.         DMA1_Channel1->CMAR = (uint32_t) adc_dma;
  467.         DMA1_Channel1->CNDTR = N;
  468.         DMA1_Channel1->CCR = DMA_CCR1_MINC | DMA_CCR1_PL_0| DMA_CCR1_CIRC|
  469.                         DMA_MemoryDataSize_HalfWord| DMA_PeripheralDataSize_HalfWord
  470.                         |DMA_CCR1_TCIE |DMA_CCR1_HTIE
  471.                         ;
  472.         DMA1_Channel1->CCR |= DMA_CCR1_EN;


  473.         // TIM2 CH1
  474.         DMA1_Channel5->CCR = 0;
  475.         DMA1_Channel5->CPAR = (uint32_t)&ADC1->SQR3;
  476.         DMA1_Channel5->CMAR = (uint32_t) &ch;
  477.         DMA1_Channel5->CNDTR = 1;
  478.         DMA1_Channel5->CCR = DMA_CCR1_CIRC | DMA_CCR1_DIR |DMA_CCR1_PL|
  479.                         DMA_MemoryDataSize_Word| DMA_PeripheralDataSize_Word        ;
  480.         DMA1_Channel5->CCR |= DMA_CCR1_EN;

  481.         NVIC_EnableIRQ(DMA1_Channel1_IRQn);
  482.         NVIC_EnableIRQ(DMA1_Channel4_IRQn);

  483.         ADC1->CR1= ADC_CR1_DISCEN;
  484.         ADC1->CR2= ADC_CR2_EXTSEL_0 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTTRIG|ADC_CR2_DMA; // tim2 - cc2
  485.         ADC1->SMPR2=ADC_SMPR2_SMP7_1|ADC_SMPR2_SMP2_1| ADC_SMPR2_SMP1_1| ADC_SMPR2_SMP0_0;
  486.         ADC1->SQR1 = 0;
  487.         ADC1->SQR3 = 1;

  488.         ADC1->CR2 |=ADC_CR2_ADON;
  489.         ADC1->CR2 |= ADC_CR2_RSTCAL;
  490.         while ((ADC1->CR2 & ADC_CR2_RSTCAL) == ADC_CR2_RSTCAL)        {;}
  491.         ADC1->CR2 |= ADC_CR2_CAL;
  492.         while ((ADC1->CR2 & ADC_CR2_CAL) == ADC_CR2_CAL)        {;}

  493.         DAC->CR |= DAC_CR_EN1|DAC_CR_EN2;
  494.         DAC->DHR12R1 = 1000;
  495.         DAC->DHR12R2 = 1000;
  496.         DAC->CR |= DAC_CR_DMAEN2;

  497.         TIM2->CR1 |= TIM_CR1_CEN;

  498.         lcd_init();
  499.         GPIOA->BSRR = GPIO_Pin_15; // BACKLIGHT ON

  500.         lcd_clear();

  501.         lcd_gotoxy(0,0);lcd_putstr("  RLC ver 6.03  ");
  502.         lcd_gotoxy(0,2);lcd_putstr("   Neekeetos    ");
  503.         lcd_gotoxy(0,3);lcd_putstr("   @yahoo.com   ");
  504.         lcd_gotoxy(0,4);lcd_putstr(" big thanks to  ");
  505.         lcd_gotoxy(0,5);lcd_putstr(" TESLight, Link ");
  506.         lcd_gotoxy(0,7);lcd_putstr("for  radiokot.ru");

  507.         while( buttons()  != 0 );// wait BUTTON release

  508.         if( (cstatus & 0xFFFFFF00) != 0x80000000 )
  509.         {
  510.                 cstatus = 0x80000000;findex = 0;
  511.         }

  512.         if(findex <0 || findex >= FCNT ) findex = 0;
  513.         freq = flist[findex];
  514.         fillSine(freq);

  515.         measure(&Z,16);

  516.         lcd_clear();

  517.         R.Re = SHUNT;
  518.         R.Im = 0;

  519.         while (1)
  520.         {

  521.                 btn = buttons();

  522.                 if( btn & PWR_BTN )        bl_status = !bl_status;
  523.                 if( btn & SP_BTN )        rsrp = ! rsrp;
  524.                 if( btn & REL_BTN )                rel = !rel;


  525.                 if( btn & SP_BTNL ){
  526.                         findex++;
  527.                         if(findex>= FCNT ) findex = 0;
  528.                         freq = flist[findex];
  529.                         fillSine(freq);

  530.                         rsrp = ! rsrp;
  531.                 }


  532.                 if( btn & REL_BTNL ){        calibrate();rel =0;cstatus |= (1<<findex);}
  533.                 if( btn & PWR_BTNL )
  534.                 {
  535.                         lcd_clear();
  536.                         lcd_gotoxy(0,4);print(" Bye Bye..");
  537.                         powerOff();
  538.                 }

  539.                 if(bl_status)
  540.                 {
  541.                         GPIOA->BSRR = GPIO_Pin_15; // BACKLIGHT ON
  542.                 }else{
  543.                         GPIOA->BRR = GPIO_Pin_15; // BACKLIGHT OFF
  544.                 }

  545.                 lcd_gotoxy(0,0);lcd_putstr("                ");


  546.                 sputdec(s,freq);
  547.                 lcd_gotoxy(0,0);lcd_putstr(s);lcd_putstr("k  ");

  548.                 if(rsrp){
  549.                         lcd_gotoxy(13*6,0);lcd_putstr("PAR");
  550.                 }else{
  551.                         lcd_gotoxy(13*6,0);lcd_putstr("SER");
  552.                 }

  553.                 if(rel) {
  554.                         lcd_gotoxy(9*6,0);lcd_putstr(">.<");
  555.                 }else{
  556.                         lcd_gotoxy(9*6,0);lcd_putstr("   ");
  557.                 }

  558.                 if( (cstatus & (1<<findex)))
  559.                 {
  560.                         lcd_gotoxy(6*5,0);lcd_putstr("CAL");
  561.                 }else{
  562.                         lcd_gotoxy(6*5,0);lcd_putstr("---");
  563.                 }


  564.                 measure(&Z,1);

  565.                 // zx = zom * (zsm-zxm)/(zxm-zom)


  566.                 if( (cstatus & (1<<findex)))
  567.                 {
  568.                         cplx tmp1,tmp2;
  569.                         tmp1.Re = Zs[findex].Re - Z.Re;
  570.                         tmp1.Im = Zs[findex].Im - Z.Im;

  571.                         tmp2.Re = Zo[findex].Re;
  572.                         tmp2.Im = Zo[findex].Im;

  573.                         cplxMul(&tmp2,&tmp1);

  574.                         tmp1.Re = Z.Re - Zo[findex].Re;
  575.                         tmp1.Im = Z.Im - Zo[findex].Im;

  576.                         cplxDiv(&tmp2,&tmp1);

  577.                         Z.Re = tmp2.Re;
  578.                         Z.Im = tmp2.Im;
  579.                 }

  580.                 Z.Re = filter(0,Z.Re);
  581.                 Z.Im = filter(1,Z.Im);

  582.                 if(rel)        {
  583.                         Z.Re -= base.Re;
  584.                         Z.Im -= base.Im;
  585.                 }else{
  586.                         base.Re= Z.Re ;
  587.                         base.Im = Z.Im;
  588.                 }

  589.                 float ls = Z.Im/6.283185307/(freq*1000.0);
  590.                 float cs = -1/6.283185307/(freq*1000.0)/Z.Im;
  591.                 float d = Z.Re/Z.Im;
  592.                 float d2 = d*d;
  593.                 float q = 1/d;

  594.                 if( rsrp == 1)
  595.                 {
  596.                         ls = ls*(1+d2);
  597.                         cs = cs/(1+d2);
  598.                         Z.Re = Z.Re*(1.0+d2)/d2;
  599.                 }

  600.                 round++;
  601.                 if(round>1)
  602.                 {
  603.                         round = 0;

  604.                         printFloat(12,2,Z.Re,"Ohm");
  605.                         lcd_gotoxy(0,2);lcd_putstr("  ");
  606.                         lcd_gotoxy(0,3);lcd_putstr("R>");

  607.                         if(Z.Im > 0)
  608.                         {
  609.                                 printFloat(12,4,ls,"H  ");
  610.                                 lcd_gotoxy(0,4);lcd_putstr("   ");
  611.                                 lcd_gotoxy(0,5);lcd_putstr("L>");
  612.                         }else{
  613.                                 printFloat(12,4,cs,"F  ");
  614.                                 lcd_gotoxy(0,4);lcd_putstr("   ");
  615.                                 lcd_gotoxy(0,5);lcd_putstr("C>");
  616.                         }

  617.                         int qq = 10000*( 1.0+absolute(d));        if(qq >19999) qq = 19999;
  618.                         sputdec(s,qq);
  619.                         lcd_gotoxy(0,7);lcd_putstr("D .");lcd_putstr(&s[1]);lcd_putstr("    ");

  620.                         qq = absolute(q);        if(qq >9999) qq = 9999;
  621.                         sputdec(s,qq);
  622.                         lcd_gotoxy(8*6,7);lcd_putstr("Q ");lcd_putstr(s);lcd_putstr("    ");

  623.                         lcd_gotoxy(0,1);lcd_putstr("________________");
  624.                         lcd_gotoxy(0,6);lcd_putstr("----------------");

  625.                 }
  626.         }
  627. }

  628. void  __attribute__((optimize("-O3"))) DMA1_Channel1_IRQHandler(void)        {
  629.         static int process = 0;
  630.         static int j=0,k=0;
  631.         static long long mreal[3];
  632.         static long long mimag[3];
  633.         int i;

  634. //        GPIOB->BSRR = GPIO_Pin_14; // set

  635.         if(process > 0)
  636.         {
  637.                 i =0 ;
  638.                 while(i++ < N/2 )
  639.                 {
  640.                         int dat = adc_dma[j] - SINE_OFFSET;
  641.                         mreal[k] += ((int)sine[j+N/4]*dat);
  642.                         mimag[k] -= ((int)sine[j]*dat);
  643.                         j++;
  644.                 }
  645.                 if(j >= N ) j = 0;
  646.         }

  647.         if(! ( DMA1->ISR & DMA_ISR_HTIF1) )        {process++; j =0;}

  648.         DMA1->IFCR = DMA1_IT_GL1;

  649.         if(process > OSR )
  650.         {
  651.                 process = 0;

  652.                 k++;if(k > 2) k = 0;
  653.                 ch = chn[k];
  654.                 j = 0;

  655.                 if( (k == 0) && ( irq_request & IRQ_ADC_SAMPLE) )
  656.                 {
  657.                         irq_request &= ~IRQ_ADC_SAMPLE;
  658.                         mData[0].Re = mreal[0];mData[0].Im = mimag[0];
  659.                         mData[1].Re = mreal[1];mData[1].Im = mimag[1];
  660.                         mData[2].Re = mreal[2];mData[2].Im = mimag[2];
  661.                         irq_status |= IRQ_ADC_SAMPLE;
  662.                 }

  663.                 mreal[k] = 0;mimag[k] = 0;

  664.         }



  665. //        GPIOB->BRR = GPIO_Pin_14; // reset
  666. }

  667. void  __attribute__((optimize("-O3")))  DMA1_Channel4_IRQHandler(void){
  668.         int j;
  669.         static int max=(N/DAC_N);
  670.         static uint32_t * dptr = dac_buf;
  671.         static int sptr = 0;
  672.         const uint32_t k = (SINE_OFFSET|(SINE_OFFSET<<16));

  673.         //GPIOB->BSRR = GPIO_Pin_13; // set

  674.         if(DMA1->ISR & DMA_ISR_HTIF4 ){
  675.                 dptr = dac_buf;max--;
  676.                 if(max <= 0 ){
  677.                         max = (N/DAC_N);
  678.                         sptr = 0;
  679.                 }

  680.         }
  681.         DMA1->IFCR = DMA1_IT_GL4;

  682.         j = DAC_N/2;

  683.         while(j-- > 0)        {
  684.                 uint32_t sig =   (( sine[sptr])>>7)&0xffff;
  685.                 *dptr++ = k + sig -  (sig<<16)  ;sptr++;
  686.         }
  687.         //GPIOB->BRR = GPIO_Pin_13; // reset
  688. }
复制代码

程序.zip

21.12 KB, 下载次数: 45

回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2015-12-26
在线时间
21 小时
发表于 2020-4-2 13:53:34 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
 楼主| 发表于 2020-4-3 22:14:38 | 显示全部楼层

这个可能是个草稿程序,有死循环跳不出来!到620行:measure(&Z,16);就过不了。TIM2->ARR 应该是71而不是63,由于有死循环跳不出来,现在也搞不清这个仪表是个什么个工作原理。
帮分析下程序工作原理吧
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 18:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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