找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 35181|回復(fù): 103
打印 上一主題 下一主題
收起左側(cè)

對(duì)STM8S電壓電流表頭重新編程(IAR環(huán)境)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:250292 發(fā)表于 2017-12-20 13:33 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
前一段時(shí)間在*寶上買了一款0-80V 0-6A可調(diào)電源,下圖左邊的。


此款電源測(cè)量電壓的精度很不錯(cuò),但是電流非常不準(zhǔn)。250mA以下顯示0,0.5A顯示0.3A,1A時(shí)顯示0.83A。3A是準(zhǔn)的,3A以上又偏大。

沒辦法打開,拆機(jī),發(fā)現(xiàn)用的表頭在淘寶上有賣,測(cè)量電流不準(zhǔn)的原因是電流分流電阻并不是表頭配套的。


沒有辦法,只有自己重新編程才能解決電流測(cè)量不準(zhǔn)的問題。首先對(duì)照實(shí)物繪制原理圖,如下。


原來這款表頭的電流量程是50A的,需配50A的分流電阻,測(cè)量電流才能達(dá)到該表頭原有的設(shè)計(jì)精度?墒谴穗娫磪s沒有用50A的分流電阻,而是用約2毫歐的分流電阻。這樣0-6A在分流電阻上的電壓為 0-12mV。
對(duì)照原理圖測(cè)量電流部分可以得出:運(yùn)放部分的放大倍數(shù)為 23(188.2/8.2)- 35(288.2/8.2),輸出電壓為 0-420mV。這個(gè)電壓太小,因?yàn)镾TM8的ADC輸入電壓可以到3300mV,所以我將放大電阻R6有原來的180k換成了1M,這樣放大倍數(shù)就變成 123-135,運(yùn)放的輸出電壓為 0-1620mV。
實(shí)際上,放大倍數(shù)在 3300/12=275時(shí)最理想(R6換成2M左右),可以充分利用ADC的轉(zhuǎn)換精度。但我手頭只有1M貼片,就沒有再折騰了。

然后就是編程了,STM8是第一次,一直在用STM32。就在網(wǎng)上找了些例子,幾番折騰終于能夠編譯和下載了。
電壓測(cè)量校準(zhǔn)比較簡(jiǎn)單,只調(diào)整電位器就能達(dá)到不錯(cuò)的精度。不過我還是用軟件作了多區(qū)間線形校正。
10V以下精度 <1%,10V以上精度 <0.5%
電流校正沒有分區(qū)間,精度基本做到 <1%。

下面是自己編程的工程文件,可以直接修改編譯。

STM8S單片機(jī)源程序(IAR環(huán)境)如下:


  1. #include "math.h"
  2. //#include "stdbool.h"
  3. #include "iostm8s003f3.h"
  4. #include "stm8s.h" //包含用到的外設(shè)的頭文件

  5. #define u8  unsigned char
  6. #define uchar  unsigned char
  7. #define uint   unsigned int
  8. #define sCnt   104

  9. uint ms_count, tmpin, ADCBuff[6], ADValueV[sCnt], ADValueI[sCnt], ADCData, mA;
  10. u8 pDataV=0, pDataI=0, vDotPS, cDotPS, VGain = 35, ampGain = 129, vFlag=0, iFlag=0;
  11. unsigned long mV;  //uint的話,mV最大只能到 65535mV,本電源80V,故用long
  12. float voltRAW, curtRAW, Rs = 0.00218;
  13. float ADVal_Av[2]={0}, Val_Av[2]={0};                     

  14. float preCoef[2]={0.005};        //ADC 轉(zhuǎn)換濾波噪聲用的系數(shù)
  15. bool preTrend[2]={TRUE};        //ADC 轉(zhuǎn)換結(jié)果的變化趨勢(shì) true:變大,false:變小
  16. float ADvalue[2]={0.0};        //ADC 前次的轉(zhuǎn)換結(jié)果濾波后的值
  17. float newData[2]={0.0};        //ADC 本次次的轉(zhuǎn)換結(jié)果

  18. /*******************************************************************************
  19. **函數(shù)名稱:void GPIO_Init0()
  20. **功能描述:GPIO->功能引腳初始化
  21. **入口參數(shù):無
  22. **輸出:無
  23. *******************************************************************************/
  24. void GPIO_Init0()
  25. {
  26.   PA_ODR |=0x02;    //PA1置高,I個(gè)位選通
  27.   PA_ODR &=0xf3;    //PA2,3置零,g,f
  28.   PA_DDR |=0x0e;    //設(shè)置端口PA1,2,3的輸入輸出方向寄存器為輸出方向
  29.   PA_CR1 |=0x0e;     //PA1,2,3為推挽輸出
  30.   PA_CR2 |=0x0e;     //PA1,2,3是輸出速度最快為10MHz
  31.   
  32.   PB_ODR |=0x30;    //PB4,5置高,I十位和百位選通
  33.   PB_DDR |=0x30;    //設(shè)置端口PB4,5的輸入輸出方向寄存器為輸出方向
  34.   PB_CR1 |=0x30;     //PB4,5為推挽輸出
  35.   PB_CR2 |=0x30;     //PB4,5是輸出速度最快為10MHz
  36.   
  37.   PC_ODR &=0x07;    //置零PC3,4,5,6,7, c,f,h,d,e
  38.   PC_DDR |=0xf8;    //設(shè)置端口PC->3,4,5,6,7的輸入輸出方向寄存器為輸出方向
  39.   PC_CR1 |=0xf8;     //PC->3,4,5,6,7為推挽輸出
  40.   PC_CR2 |=0xf8;     //PC->3,4,5,6,7是輸出速度最快為10MHz
  41.   
  42.   PD_ODR &=0xfd;    //置零PD1, a
  43.   PD_ODR |=0x70;    //PD4,5,6置高 V百位 個(gè)位 和十位選通
  44.   PD_DDR |=0x72;    //設(shè)置端口PD->1,4,5,6的輸入輸出方向寄存器為輸出方向
  45.   PD_CR1 |=0x72;     //PD->1,4,5,6為推挽輸出
  46.   PD_CR2 |=0x72;     //PD->1,4,5,6是輸出速度最快為10MHz
  47. }

  48. /*******************************************************************************
  49. **函數(shù)名稱:void SMG_Display(int num)
  50. **功能描述:SMG顯示函數(shù)
  51. **入口參數(shù):int num
  52. **輸出:無
  53. *******************************************************************************/
  54. void SMG1_Display(unsigned char num)
  55. {
  56.   PA_ODR |=0x02;    //PA1置高,I個(gè)位選通
  57.   PB_ODR |=0x30;    //PB4,5置高,I十位和百位選通
  58.   PD_ODR |=0x70;    //PD4,5,6置高 V百位 個(gè)位 和十位選通
  59.   switch(num)
  60.   {
  61.   case 0: //a b c d e f
  62.     PA_ODR |=0x08;    //PA3置高,b
  63.     PA_ODR &=0xfb;    //PA2置零,g
  64.     PC_ODR &=0xdf;    //置零PC5,h
  65.     PC_ODR |=0xd8;    //PC3,4,6,7置高 c,f,d,e
  66.     PD_ODR |=0x02;    //PD1置高 a
  67.     break;
  68.   case 1: //b c
  69.     PA_ODR |=0x08;    //PA3置高,b
  70.     PA_ODR &=0xfb;    //PA2置零,g
  71.     PC_ODR &=0x0f;    //置零PC4,5,6,7,f,h,d,e
  72.     PC_ODR |=0x08;    //PC3置高 c
  73.     PD_ODR &=0xfd;    //PD1置零 a
  74.     break;
  75.   case 2: // a b d e g
  76.     PA_ODR |=0x0c;    //PA2,3置高,g,b
  77.     PC_ODR &=0xc7;    //置零PC3,4,5 c,f,h
  78.     PC_ODR |=0xc0;    //PC6,7置高,d e
  79.     PD_ODR |=0x02;    //PD1置高 a
  80.     break;
  81.   case 3: //a b c d g
  82.     PA_ODR |=0x0c;    //PA2,3置高,g,b
  83.     PC_ODR &=0x4f;    //置零PC4,5,7,f,h,e
  84.     PC_ODR |=0x48;    //PC3,6置高 c,d
  85.     PD_ODR |=0x02;    //PD1置高 a
  86.     break;
  87.   case 4: //b c f g
  88.     PA_ODR |=0x0c;    //PA2,3置高,g,b
  89.     PC_ODR &=0x1f;    //置零PC5,6,7,h,d,e
  90.     PC_ODR |=0x18;    //PC3,4置高 c,f
  91.     PD_ODR &=0xfd;    //PD1置零 a
  92.     break;
  93.   case 5: //a c d f g
  94.     PA_ODR |=0x04;    //PA2置高,g
  95.     PA_ODR &=0xf7;    //PA3置零,b
  96.     PC_ODR &=0x5f;    //置零PC5,7 h,e
  97.     PC_ODR |=0x58;    //PC3,4,6置高 c,f,d
  98.     PD_ODR |=0x02;    //PD1置高 a
  99.     break;
  100.   case 6: //a c d e f g
  101.     PA_ODR |=0x04;    //PA2置高,g
  102.     PA_ODR &=0xf7;    //PA3置零,b
  103.     PC_ODR &=0xdf;    //置零PC5,h
  104.     PC_ODR |=0xd8;    //PC3,4,6,7置高 c,f,d,e
  105.     PD_ODR |=0x02;    //PD1置高 a
  106.     break;
  107.   case 7: //a b c
  108.     PA_ODR |=0x08;    //PA3置高,b
  109.     PA_ODR &=0xfb;    //PA2置零,g
  110.     PC_ODR &=0x0f;    //置零PC4,5,6,7,f,h,d,e
  111.     PC_ODR |=0x08;    //PC3置高 c
  112.     PD_ODR |=0x02;    //PD1置高 a
  113.     break;
  114.   case 8: //a b c d e f g
  115.     PA_ODR |=0x0c;    //PA2,3置高,g,b
  116.     PC_ODR &=0xdf;    //置零PC5,h
  117.     PC_ODR |=0xd8;    //PC3,4,6,7置高 c,f,d,e
  118.     PD_ODR |=0x02;    //PD1置高 a
  119.     break;
  120.   case 9: //a b c d f g
  121.     PA_ODR |=0x0c;    //PA2,3置高,g,b
  122.     PC_ODR &=0x5f;    //置零PC5,7 h,e
  123.     PC_ODR |=0x58;    //PC3,4,6置高 c,f,d
  124.     PD_ODR |=0x02;    //PD1置高 a
  125.     break;
  126.   }
  127. }


  128. /*******************************************************************************
  129. **函數(shù)名稱:void ADC_Init()
  130. **功能描述:初始化ADC
  131. **入口參數(shù):無
  132. **輸出:無
  133. *******************************************************************************/
  134. void ADC_Init()
  135. {
  136.   //電流
  137.   PD_DDR_bit.DDR2 = 0;   //設(shè)置PD->2 為輸入
  138.   PD_CR1_bit.C12 = 0;    //設(shè)置為浮空輸入
  139.   PD_CR2_bit.C22 = 0;    //設(shè)置中斷禁止
  140.   
  141.   //電壓
  142.   PD_DDR_bit.DDR3 = 0;   //設(shè)置PD->3 為輸入
  143.   PD_CR1_bit.C13 = 0;    //設(shè)置為浮空輸入
  144.   PD_CR2_bit.C23 = 0;    //設(shè)置中斷禁止
  145.   
  146.   ADC_CR1_bit.SPSEL = 7;    //fmaster / 18 = 16MHZ / 18 = 888888HZ
  147.   ADC_CR2_bit.ALIGN = 1;    //RIGHT ALIGN
  148.   
  149.   ADC_CR1_bit.ADON = 1;     //初次上電喚醒ADC
  150. }


  151. /*******************************************************************************
  152. **函數(shù)名稱:uint Get_Adc(unsigned char ac)
  153. **功能描述:讀取ADC完成一次模數(shù)轉(zhuǎn)換結(jié)果
  154. **入口參數(shù):ac ->ADC通道號(hào)
  155. **輸出:ADC轉(zhuǎn)換結(jié)果
  156. *******************************************************************************/
  157. uint Get_Adc(u8 ac)           //獲取adc值
  158. {
  159.   uint Value;
  160.   ADC_CSR_bit.CH = ac;       //選擇ADC通道 AIN3,4
  161.   ADC_CR1 |= 0x01;           //開始轉(zhuǎn)換
  162.   while((0x80&ADC_CSR)==0); //等待轉(zhuǎn)換完成
  163.   ADC_CSR &= ~0x80;          //清除轉(zhuǎn)換標(biāo)志
  164.   Value  = (uint)ADC_DRL;    //取低8位
  165.   Value |= (uint)ADC_DRH<<8; //低8位和高兩位合并
  166.   return(Value);            //返回adc值
  167. }

  168. float* Ad_Av(u8 ac)      //每次只采樣一個(gè)數(shù)據(jù),采完sCnt個(gè)數(shù)據(jù)就更新結(jié)果,否則就顯示上一次的結(jié)果
  169. {
  170.   u8 num, pMaxV=0, pMaxV2=0, pMinV=0, pMinV2=0, pMaxI=0, pMaxI2=0, pMinI=0, pMinI2=0;
  171.   if(ac==4){    //電壓
  172.     ADValueV[pDataV] = Get_Adc(ac);
  173.     Val_Av[0] += ADValueV[pDataV++];
  174.   }else{    //電流
  175.     ADValueI[pDataI] = Get_Adc(ac);
  176.     Val_Av[1] += ADValueI[pDataI++];
  177.   }
  178.   if(pDataV>=sCnt){     //電壓數(shù)據(jù)采樣完成,去除最大最小求平均
  179.     pDataV=0; vFlag=1;
  180.     for(num=0;num<sCnt;num++) {
  181.       if(ADValueV[num] < ADValueV[pMinV]) pMinV = num;
  182.       if(ADValueV[num] > ADValueV[pMaxV]) pMaxV = num;
  183.     }
  184.     for(num=0;num<sCnt;num++) {       //去掉次大次小
  185.       if(num != pMinV && ADValueV[num] < ADValueV[pMinV2]) pMinV2 = num;
  186.       if(num != pMaxV && ADValueV[num] > ADValueV[pMaxV2]) pMaxV2 = num;
  187.     }
  188.     ADVal_Av[0] = (Val_Av[0] - ADValueV[pMinV] - ADValueV[pMinV2] - ADValueV[pMaxV] - ADValueV[pMaxV2])/(sCnt-4);                    
  189.     //ADVal_Av[0] = (Val_Av[0] - ADValueV[pMinV] - ADValueV[pMaxV])/(sCnt-2);   //只去掉最大最小的話,用這句
  190.     Val_Av[0]=0;
  191.   }
  192.   if(pDataI>=sCnt){     //電流數(shù)據(jù)采樣完成,去除最大最小求平均
  193.     pDataI=0; iFlag=1;
  194.     for(num=0;num<sCnt;num++) {
  195.       if(ADValueI[num] < ADValueI[pMinI]) pMinI = num;
  196.       if(ADValueI[num] > ADValueI[pMaxI]) pMaxI = num;
  197.     }
  198.     for(num=0;num<sCnt;num++) {       //如果還要去掉次大次小的話,就去掉注釋
  199.       if(num != pMinI && ADValueI[num] < ADValueI[pMinI2]) pMinI2 = num;
  200.       if(num != pMaxI && ADValueI[num] > ADValueI[pMaxI2]) pMaxI2 = num;
  201.     }
  202.     ADVal_Av[1] = (Val_Av[1] - ADValueI[pMinI] - ADValueI[pMinI2] - ADValueI[pMaxI] - ADValueI[pMaxI2])/(sCnt-4);                    
  203.     //ADVal_Av[1] = (Val_Av[1] - ADValueI[pMinI] - ADValueI[pMaxI])/(sCnt-2);     //只去掉最大最小的話,用這句                  
  204.     Val_Av[1]=0;
  205.   }
  206.   return(ADVal_Av);                       
  207. }

  208. /*****  噪聲濾波     *******************
  209. baseCoef:濾波系數(shù),越小濾波越強(qiáng);
  210. i:通道,可供多個(gè)測(cè)量對(duì)象濾波
  211. preCoef:上次濾波后計(jì)算的系數(shù)值
  212. preTrend:上次濾波的數(shù)據(jù)變化方向
  213. preData:上次濾波后的結(jié)果
  214. newData:這次新采樣的數(shù)據(jù)
  215. ***********************************************************************/
  216. void Noise_Filter(float baseCoef, u8 i, float *preCoef, bool *preTrend, float *preData, float *newData){
  217.   bool newTrend;
  218.   if (newData[i] == preData[i]) return;
  219.   if (newData[i] > preData[i]) newTrend = TRUE;
  220.   else newTrend = FALSE;
  221.   if (newTrend == preTrend[i])        preCoef[i] = preCoef[i] * 2;
  222.   else preCoef[i] = baseCoef;
  223.   preTrend[i] = newTrend;
  224.   if(preCoef[i] < baseCoef) preCoef[i] = baseCoef;
  225.   else if(preCoef[i] > 0.995) preCoef[i] = 0.995;
  226.   preData[i] = preData[i] + (newData[i] - preData[i])* preCoef[i];
  227. }

  228. /*****  電壓數(shù)據(jù)處理  ***************************************
  229. tmpin:采集的電壓數(shù)據(jù);
  230. 輸出:電壓值,單位:V
  231. *********************************************************/
  232. float ProcessVoltage(float tmpin)
  233. {
  234.     float Temp;
  235.     Temp = tmpin * 3.3 * VGain / 1023; //單位:V
  236.     //下面是校正,應(yīng)根據(jù)實(shí)際情況重新計(jì)算。其實(shí)不校正精度也不錯(cuò)
  237.     if(Temp<=0.5) Temp = 1.0 * Temp;   
  238.     else if(Temp>0.5 && Temp<2.5) Temp = 0.98 * Temp + 0.28;
  239.     else if(Temp<6.5) Temp = 1.005 * Temp + 0.235;
  240.     else if(Temp<11.5) Temp = 1.00325 * Temp + 0.22925;
  241.     else if(Temp<36.5) Temp = 0.990417 * Temp + 0.385;
  242.     else  Temp = 0.988889 * Temp + 0.482222;
  243.     if(Temp<0) Temp=0;
  244.     return (Temp);
  245.    
  246. }

  247. /*****  電流數(shù)據(jù)處理  ***************************************
  248. tmpin:采集的電流數(shù)據(jù);
  249. 輸出:電流值,單位:A
  250. *********************************************************/
  251. float ProcessCurrent(float tmpin)
  252. {
  253.     float Temp;
  254.     Temp = tmpin * 3.3 / 1023 / ampGain / Rs;    //單位:A
  255.     //下面是校正,應(yīng)根據(jù)實(shí)際情況重新計(jì)算。本例中是將運(yùn)放的反饋電阻 R6(180k)
  256.     //改成 1M后,放大系數(shù)ampGain由29變?yōu)?29。
  257.     //取樣電阻 Rs約為 2mR。
  258.     Temp = 1.385042 * Temp - 1.698751;
  259.     if(Temp<0) Temp=0;
  260.     return (Temp);
  261.    
  262. }

  263. /****   本例中未使用     ******************************************************
  264. **函數(shù)名稱:void Timer4Init()
  265. **功能描述:定時(shí)器4參數(shù)初始化
  266. **入口參數(shù):無
  267. **輸出:無
  268. *******************************************************************************/
  269. void Timer4Init()
  270. {
  271.   TIM4_IER_bit.UIE = 0;       //禁止中斷
  272.   TIM4_EGR_bit.UG = 0;           
  273.   TIM4_PSCR_bit.PSC = 7;      // 設(shè)置TIM4的時(shí)鐘分頻系數(shù)為 128  即定時(shí)器時(shí)鐘 = 16000000 /128 = 125KHZ
  274.                                                             
  275.   TIM4_ARR = 125;             // 設(shè)定TIM4產(chǎn)生1毫秒的計(jì)數(shù)值
  276.   TIM4_CNTR = 0x00;            // 清除TIM4計(jì)數(shù)寄存器數(shù)值
  277.    
  278.   TIM4_SR_bit.UIF = 0;        //清除中斷標(biāo)志
  279.   TIM4_SR_bit.TIF = 0;
  280.   TIM4_CR1_bit.CEN = 1;       //使能定時(shí)器4計(jì)數(shù)
  281.   TIM4_CR1_bit.ARPE = 1;      //使能預(yù)裝載
  282.   TIM4_IER_bit.UIE = 1;       // 使能更新中斷
  283. }

  284. /****   本例中未使用    *******************************************************
  285. **函數(shù)名稱:void TIM2_Init()
  286. **功能描述:定時(shí)器2參數(shù)初始化
  287. **入口參數(shù):無
  288. **輸出:無
  289. *******************************************************************************/
  290. void TIM2_Init()
  291. {
  292.   TIM2_PSCR = 0x00;     //定時(shí)器2預(yù)分頻數(shù)為 1 分頻,即定時(shí)器時(shí)鐘 = 系統(tǒng)時(shí)鐘 = 16MHz
  293.   TIM2_ARRH = 0x3E;     //設(shè)置1毫秒時(shí)間自動(dòng)重載 16000 = 0x3e80
  294.   TIM2_ARRL = 0x80;     //

  295.   TIM2_CNTRH = 0x00;    //清除計(jì)數(shù)寄存器
  296.   TIM2_CNTRL = 0x00;    //
  297.   TIM2_SR1 = 0x00;      //清除所有的中斷標(biāo)志

  298. }

  299. /****   本例中未使用    ******************************************************
  300. **函數(shù)名稱:void TIM2_DelayMs(unsigned int ms)
  301. **功能描述:定時(shí)器2參進(jìn)行精確延時(shí),最小為1毫秒,最大65535
  302. **入口參數(shù):unsigned int ms     1=< ms <= 65535
  303. **輸出:無
  304. *******************************************************************************/
  305. void TIM2_DelayMs(unsigned int ms)
  306. {
  307.    
  308.     TIM2_CR1 = 0x81;        //啟動(dòng)定時(shí)器2開始計(jì)數(shù)
  309.     while(ms--)
  310.     {
  311.       
  312.       while( !(TIM2_SR1 & 0x01)); //等待計(jì)數(shù)是否達(dá)到1毫秒
  313.       TIM2_SR1 &= ~(0x01);  //計(jì)數(shù)完成1毫秒,清除相應(yīng)的標(biāo)志
  314.     }
  315.      TIM2_CR1 = 0x00;       //延時(shí)全部結(jié)束,關(guān)閉定時(shí)器2
  316. }

  317. /*******************************************************************************
  318. **函數(shù)名稱:void delay(unsigned int ms)
  319. **功能描述:大概延時(shí)
  320. **入口參數(shù):unsigned int ms   輸入大概延時(shí)數(shù)值
  321. **輸出:無
  322. *******************************************************************************/
  323. void delay(unsigned int ms)
  324. {
  325.   unsigned int x , y;
  326.   for(x = ms; x > 0; x--)           /*  通過一定周期循環(huán)進(jìn)行延時(shí)*/
  327.     for(y = 1000 ; y > 0 ; y--);
  328. }

  329. /*******************************************************************************
  330. **函數(shù)名稱:void V_Show()
  331. **功能描述:在數(shù)碼管上顯示電壓值
  332. **入口參數(shù):ms:每個(gè)數(shù)碼管延時(shí)。顯示數(shù)據(jù)存儲(chǔ)在 ADCBuff[2] - ADCBuff[0]
  333. **輸出:無
  334. *******************************************************************************/
  335. void V_Show(unsigned int ms)
  336. {
  337.   SMG1_Display(ADCBuff[2]);   //顯示V百位
  338.   if(vDotPS==2) PC_ODR |=0x20;    //PC5置高,h點(diǎn)
  339.   PD_ODR &=0xef;    //PD4置低 V百位選通
  340.   delay(ms);
  341.   SMG1_Display(ADCBuff[1]);   //顯示V十位
  342.   if(vDotPS==1) PC_ODR |=0x20;    //PC5置高,h點(diǎn)
  343.   PD_ODR &=0xbf;    //PD6置低 V十位選通
  344.   delay(ms);
  345.   SMG1_Display(ADCBuff[0]);   //顯示V個(gè)位
  346.   PD_ODR &=0xdf;    //PD5置低 V個(gè)位選通
  347.   delay(ms);
  348. }

  349. /*******************************************************************************
  350. **函數(shù)名稱:void I_Show()
  351. **功能描述:在數(shù)碼管上顯示電流值
  352. **入口參數(shù):ms:每個(gè)數(shù)碼管延時(shí)。顯示數(shù)據(jù)存儲(chǔ)在 ADCBuff[5] - ADCBuff[3]
  353. **輸出:無
  354. *******************************************************************************/
  355. void I_Show(unsigned int ms)
  356. {
  357.   SMG1_Display(ADCBuff[5]);   //顯示A百位
  358.   if(cDotPS==5) PC_ODR |=0x20;    //PC5置高,h點(diǎn)
  359.   PB_ODR &=0xdf;    //PB5置低,I百位選通
  360.   delay(ms);
  361.   SMG1_Display(ADCBuff[4]);   //顯示A十位
  362.   if(cDotPS==4) PC_ODR |=0x20;    //PC5置高,h點(diǎn)
  363.   PB_ODR &=0xe0;    //PB4置低,I十位選通
  364.   delay(ms);
  365.   SMG1_Display(ADCBuff[3]);   //顯示A個(gè)位
  366.   PA_ODR &=0xfd;    //PA1置低,I個(gè)位選通
  367.   delay(ms);
  368. }


  369. /*    主函數(shù)    */
  370. int main(void)
  371. {
  372.   //asm("sim");             //關(guān)閉系統(tǒng)總中斷
  373.   CLK_CKDIVR = 0x00;      //CPUDIV = 1 HSIDIV = 1  內(nèi)部時(shí)鐘 = 16Mhz
  374.   GPIO_Init0();
  375.   ADC_Init();             //調(diào)用ADC初始化函數(shù)
  376.   //TIM2_Init();
  377.   //Timer4Init();           //初始化定時(shí)器4
  378.   //asm("rim");             //打開系統(tǒng)總中斷
  379.   while(1)
  380.   {
  381.     //if(adcflag == 1)                        //1秒定時(shí)時(shí)間到對(duì)使能ADC進(jìn)行采樣
  382.     //{
  383.       //asm("sim");                           //關(guān)系統(tǒng)總中斷

  384.     voltRAW = Ad_Av(4)[0];      //獲取電壓數(shù)據(jù)
  385.     if(vFlag==1){       //電壓數(shù)據(jù)采集完成才進(jìn)行以下計(jì)算,否則跳過,將顯示上次數(shù)據(jù)
  386.       vFlag=0;
  387.       newData[0] = ProcessVoltage(voltRAW);
  388.       Noise_Filter(0.5, 0, preCoef, preTrend, ADvalue, newData);
  389.       //ADvalue[0] = newData[0];        //不要上面的濾波時(shí)使用
  390.       mV = (unsigned long)(ADvalue[0]*1000);
  391.       if(mV > 9999){
  392.         vDotPS=1;
  393.         ADCBuff[0] = mV / 100 % 10;     //0.1V
  394. ……………………

  395. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
STM8S_VIMeter.zip (1.16 MB, 下載次數(shù): 803)



評(píng)分

參與人數(shù) 5黑幣 +127 收起 理由
BigWheels + 6 很給力!
csy1991hf + 10 很給力!
wlxf + 1 剛好可以用到,多謝分享
qjzyx + 10 高手,向你學(xué)習(xí)!
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏63 分享淘帖 頂6 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:55317 發(fā)表于 2018-1-16 11:35 | 只看該作者
多謝分享,好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:266116 發(fā)表于 2018-1-16 14:18 | 只看該作者
謝謝分享!
回復(fù)

使用道具 舉報(bào)

地板
ID:98894 發(fā)表于 2018-1-21 19:27 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

5#
ID:98894 發(fā)表于 2018-1-21 19:27 | 只看該作者
不錯(cuò),挺好的資料
回復(fù)

使用道具 舉報(bào)

6#
ID:289512 發(fā)表于 2018-3-9 16:18 | 只看該作者
高手,謝謝樓主的分享。。。。。
回復(fù)

使用道具 舉報(bào)

7#
ID:296060 發(fā)表于 2018-4-9 17:01 | 只看該作者
感謝分享,學(xué)習(xí)下!
回復(fù)

使用道具 舉報(bào)

8#
ID:44037 發(fā)表于 2018-4-10 07:03 | 只看該作者
謝謝樓主的分享。。。學(xué)習(xí)  學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

9#
ID:307026 發(fā)表于 2018-4-12 23:45 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

10#
ID:314905 發(fā)表于 2018-4-24 13:36 | 只看該作者
感謝分享,電壓表壞了可以修理了。
回復(fù)

使用道具 舉報(bào)

11#
ID:202897 發(fā)表于 2018-6-7 13:22 | 只看該作者
樓主請(qǐng)教:輸入VGain = 35,是如何計(jì)算的?tmpin * 3.3 * VGain / 1023
回復(fù)

使用道具 舉報(bào)

12#
ID:202897 發(fā)表于 2018-6-7 14:11 | 只看該作者
看明白了,輸入電壓又被分壓270/8.2=33,10K調(diào)節(jié)到軟件設(shè)定35
回復(fù)

使用道具 舉報(bào)

13#
ID:378605 發(fā)表于 2018-10-11 20:08 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

14#
ID:239055 發(fā)表于 2018-11-17 16:00 來自手機(jī) | 只看該作者
我手上也有一個(gè)和你相似的電壓電流模塊,程序有沒有編譯好的?燒寫用什么軟件?
回復(fù)

使用道具 舉報(bào)

15#
ID:171207 發(fā)表于 2018-11-29 11:55 | 只看該作者

好東西要學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

16#
ID:437372 發(fā)表于 2018-12-1 21:23 | 只看該作者
多謝分享,好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

17#
ID:246635 發(fā)表于 2018-12-5 20:26 | 只看該作者
謝謝分享,我能直接照做一個(gè)吧
回復(fù)

使用道具 舉報(bào)

18#
ID:149992 發(fā)表于 2018-12-25 16:05 | 只看該作者
多謝分享,好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

19#
ID:149992 發(fā)表于 2018-12-30 14:20 | 只看該作者
去某寶買了這個(gè)一樣的表,到手居然MCU居然換成了新唐芯片,自己動(dòng)手換芯片,換芯片后顯示正常,但是測(cè)量USB5v電壓個(gè)位數(shù)跳的厲害。
回復(fù)

使用道具 舉報(bào)

20#
ID:466148 發(fā)表于 2019-1-19 17:44 來自手機(jī) | 只看該作者
請(qǐng)問如果想還輸出一路pwm,要用那個(gè)腳可以用?本人剛接觸stm8,菜鳥中的雛鳥,望不要見笑。
回復(fù)

使用道具 舉報(bào)

21#
ID:104974 發(fā)表于 2019-1-31 15:59 | 只看該作者
剛好可以用到,多謝分享!
回復(fù)

使用道具 舉報(bào)

22#
ID:33899 發(fā)表于 2019-2-27 09:17 | 只看該作者
樓主厲害,需要里面的濾波函數(shù),學(xué)習(xí)學(xué)習(xí)樓主
回復(fù)

使用道具 舉報(bào)

23#
ID:33899 發(fā)表于 2019-2-27 09:21 | 只看該作者
就是有點(diǎn)貴啊
回復(fù)

使用道具 舉報(bào)

24#
ID:33899 發(fā)表于 2019-2-27 19:50 | 只看該作者
很好用,濾波函數(shù)已經(jīng)移植到我的軟件里面,效果很明顯,如下圖

8a06e681e54af0857ba03a563e4a0f8.png (36.51 KB, 下載次數(shù): 180)

8a06e681e54af0857ba03a563e4a0f8.png
回復(fù)

使用道具 舉報(bào)

25#
ID:488256 發(fā)表于 2019-3-11 01:09 | 只看該作者
感謝分享~正需要學(xué)習(xí)下!
回復(fù)

使用道具 舉報(bào)

26#
ID:488949 發(fā)表于 2019-3-13 03:43 來自手機(jī) | 只看該作者
我這個(gè)單片機(jī)芯片型號(hào)被可惡的商家搽掉了!跟你說的差不多。電壓還行,電流不回零。重新刷代碼行嗎?
回復(fù)

使用道具 舉報(bào)

27#
ID:489675 發(fā)表于 2019-3-13 09:17 來自手機(jī) | 只看該作者
謝謝樓主,下載了
回復(fù)

使用道具 舉報(bào)

28#
ID:490467 發(fā)表于 2019-3-14 10:01 | 只看該作者
很好的教程說明,感謝,可以多多學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

29#
ID:466148 發(fā)表于 2019-3-15 17:21 來自手機(jī) | 只看該作者
我買的芯片型號(hào)也擦掉了,按stm8s003、103都讀不了,關(guān)鍵是聯(lián)系不上設(shè)備,還有辦法嗎?
回復(fù)

使用道具 舉報(bào)

30#
ID:499770 發(fā)表于 2019-3-29 21:29 | 只看該作者
謝謝樓主的分享
回復(fù)

使用道具 舉報(bào)

31#
ID:236621 發(fā)表于 2019-4-3 23:36 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

32#
ID:149630 發(fā)表于 2019-4-19 20:45 | 只看該作者
感謝,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

33#
ID:275144 發(fā)表于 2019-4-24 10:23 | 只看該作者
ken123 發(fā)表于 2019-4-19 20:45
感謝,學(xué)習(xí)了

請(qǐng)問大師們,按上圖原理圖電壓表頭怎么沒電壓顯示呢
回復(fù)

使用道具 舉報(bào)

34#
ID:536468 發(fā)表于 2019-5-13 13:13 | 只看該作者
lixianshen 發(fā)表于 2019-3-15 17:21
我買的芯片型號(hào)也擦掉了,按stm8s003、103都讀不了,關(guān)鍵是聯(lián)系不上設(shè)備,還有辦法嗎?

因?yàn)楣╇姷膯栴}嗎
回復(fù)

使用道具 舉報(bào)

35#
ID:536468 發(fā)表于 2019-5-13 14:52 | 只看該作者
lixianshen 發(fā)表于 2019-1-19 17:44
請(qǐng)問如果想還輸出一路pwm,要用那個(gè)腳可以用?本人剛接觸stm8,菜鳥中的雛鳥,望不要見笑。

請(qǐng)問可以嗎重新輸出?
回復(fù)

使用道具 舉報(bào)

36#
ID:536468 發(fā)表于 2019-5-13 14:53 | 只看該作者
lixianshen 發(fā)表于 2019-3-15 17:21
我買的芯片型號(hào)也擦掉了,按stm8s003、103都讀不了,關(guān)鍵是聯(lián)系不上設(shè)備,還有辦法嗎?

這個(gè)板子接到電腦上的接線圖可以分享一下嗎謝謝
回復(fù)

使用道具 舉報(bào)

37#
ID:536468 發(fā)表于 2019-5-13 14:54 | 只看該作者
請(qǐng)問這個(gè)板子怎么接到電腦上進(jìn)行燒錄啊
回復(fù)

使用道具 舉報(bào)

38#
ID:541986 發(fā)表于 2019-5-19 16:15 | 只看該作者
好資料,謝謝分享!
回復(fù)

使用道具 舉報(bào)

39#
ID:510119 發(fā)表于 2019-5-27 15:55 | 只看該作者
ccy1231 發(fā)表于 2019-4-24 10:23
請(qǐng)問大師們,按上圖原理圖電壓表頭怎么沒電壓顯示呢

你也在弄這個(gè)電壓電流表嗎,我試了,不能用
回復(fù)

使用道具 舉報(bào)

40#
ID:56665 發(fā)表于 2019-5-27 17:52 | 只看該作者
謝謝樓主的分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表