找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 28103|回复: 103
打印 上一主题 下一主题
收起左侧

对STM8S电压电流表头重新编程(IAR环境)

  [复制链接]
跳转到指定楼层
楼主
ID:250292 发表于 2017-12-20 13:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前一段时间在*宝上买了一款0-80V 0-6A可调电源,下图左边的。


此款电源测量电压的精度很不错,但是电流非常不准。250mA以下显示0,0.5A显示0.3A,1A时显示0.83A。3A是准的,3A以上又偏大。

没办法打开,拆机,发现用的表头在淘宝上有卖,测量电流不准的原因是电流分流电阻并不是表头配套的。


没有办法,只有自己重新编程才能解决电流测量不准的问题。首先对照实物绘制原理图,如下。


原来这款表头的电流量程是50A的,需配50A的分流电阻,测量电流才能达到该表头原有的设计精度。可是此电源却没有用50A的分流电阻,而是用约2毫欧的分流电阻。这样0-6A在分流电阻上的电压为 0-12mV。
对照原理图测量电流部分可以得出:运放部分的放大倍数为 23(188.2/8.2)- 35(288.2/8.2),输出电压为 0-420mV。这个电压太小,因为STM8的ADC输入电压可以到3300mV,所以我将放大电阻R6有原来的180k换成了1M,这样放大倍数就变成 123-135,运放的输出电压为 0-1620mV。
实际上,放大倍数在 3300/12=275时最理想(R6换成2M左右),可以充分利用ADC的转换精度。但我手头只有1M贴片,就没有再折腾了。

然后就是编程了,STM8是第一次,一直在用STM32。就在网上找了些例子,几番折腾终于能够编译和下载了。
电压测量校准比较简单,只调整电位器就能达到不错的精度。不过我还是用软件作了多区间线形校正。
10V以下精度 <1%,10V以上精度 <0.5%
电流校正没有分区间,精度基本做到 <1%。

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

STM8S单片机源程序(IAR环境)如下:


  1. #include "math.h"
  2. //#include "stdbool.h"
  3. #include "iostm8s003f3.h"
  4. #include "stm8s.h" //包含用到的外设的头文件

  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 转换滤波噪声用的系数
  15. bool preTrend[2]={TRUE};        //ADC 转换结果的变化趋势 true:变大,false:变小
  16. float ADvalue[2]={0.0};        //ADC 前次的转换结果滤波后的值
  17. float newData[2]={0.0};        //ADC 本次次的转换结果

  18. /*******************************************************************************
  19. **函数名称:void GPIO_Init0()
  20. **功能描述:GPIO->功能引脚初始化
  21. **入口参数:无
  22. **输出:无
  23. *******************************************************************************/
  24. void GPIO_Init0()
  25. {
  26.   PA_ODR |=0x02;    //PA1置高,I个位选通
  27.   PA_ODR &=0xf3;    //PA2,3置零,g,f
  28.   PA_DDR |=0x0e;    //设置端口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;    //设置端口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;    //设置端口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百位 个位 和十位选通
  44.   PD_DDR |=0x72;    //设置端口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. **函数名称:void SMG_Display(int num)
  50. **功能描述:SMG显示函数
  51. **入口参数:int num
  52. **输出:无
  53. *******************************************************************************/
  54. void SMG1_Display(unsigned char num)
  55. {
  56.   PA_ODR |=0x02;    //PA1置高,I个位选通
  57.   PB_ODR |=0x30;    //PB4,5置高,I十位和百位选通
  58.   PD_ODR |=0x70;    //PD4,5,6置高 V百位 个位 和十位选通
  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. **函数名称:void ADC_Init()
  130. **功能描述:初始化ADC
  131. **入口参数:无
  132. **输出:无
  133. *******************************************************************************/
  134. void ADC_Init()
  135. {
  136.   //电流
  137.   PD_DDR_bit.DDR2 = 0;   //设置PD->2 为输入
  138.   PD_CR1_bit.C12 = 0;    //设置为浮空输入
  139.   PD_CR2_bit.C22 = 0;    //设置中断禁止
  140.   
  141.   //电压
  142.   PD_DDR_bit.DDR3 = 0;   //设置PD->3 为输入
  143.   PD_CR1_bit.C13 = 0;    //设置为浮空输入
  144.   PD_CR2_bit.C23 = 0;    //设置中断禁止
  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. **函数名称:uint Get_Adc(unsigned char ac)
  153. **功能描述:读取ADC完成一次模数转换结果
  154. **入口参数:ac ->ADC通道号
  155. **输出:ADC转换结果
  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;           //开始转换
  162.   while((0x80&ADC_CSR)==0); //等待转换完成
  163.   ADC_CSR &= ~0x80;          //清除转换标志
  164.   Value  = (uint)ADC_DRL;    //取低8位
  165.   Value |= (uint)ADC_DRH<<8; //低8位和高两位合并
  166.   return(Value);            //返回adc值
  167. }

  168. float* Ad_Av(u8 ac)      //每次只采样一个数据,采完sCnt个数据就更新结果,否则就显示上一次的结果
  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){     //电压数据采样完成,去除最大最小求平均
  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){     //电流数据采样完成,去除最大最小求平均
  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:滤波系数,越小滤波越强;
  210. i:通道,可供多个测量对象滤波
  211. preCoef:上次滤波后计算的系数值
  212. preTrend:上次滤波的数据变化方向
  213. preData:上次滤波后的结果
  214. newData:这次新采样的数据
  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. /*****  电压数据处理  ***************************************
  229. tmpin:采集的电压数据;
  230. 输出:电压值,单位:V
  231. *********************************************************/
  232. float ProcessVoltage(float tmpin)
  233. {
  234.     float Temp;
  235.     Temp = tmpin * 3.3 * VGain / 1023; //单位:V
  236.     //下面是校正,应根据实际情况重新计算。其实不校正精度也不错
  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. /*****  电流数据处理  ***************************************
  248. tmpin:采集的电流数据;
  249. 输出:电流值,单位:A
  250. *********************************************************/
  251. float ProcessCurrent(float tmpin)
  252. {
  253.     float Temp;
  254.     Temp = tmpin * 3.3 / 1023 / ampGain / Rs;    //单位:A
  255.     //下面是校正,应根据实际情况重新计算。本例中是将运放的反馈电阻 R6(180k)
  256.     //改成 1M后,放大系数ampGain由29变为129。
  257.     //取样电阻 Rs约为 2mR。
  258.     Temp = 1.385042 * Temp - 1.698751;
  259.     if(Temp<0) Temp=0;
  260.     return (Temp);
  261.    
  262. }

  263. /****   本例中未使用     ******************************************************
  264. **函数名称:void Timer4Init()
  265. **功能描述:定时器4参数初始化
  266. **入口参数:无
  267. **输出:无
  268. *******************************************************************************/
  269. void Timer4Init()
  270. {
  271.   TIM4_IER_bit.UIE = 0;       //禁止中断
  272.   TIM4_EGR_bit.UG = 0;           
  273.   TIM4_PSCR_bit.PSC = 7;      // 设置TIM4的时钟分频系数为 128  即定时器时钟 = 16000000 /128 = 125KHZ
  274.                                                             
  275.   TIM4_ARR = 125;             // 设定TIM4产生1毫秒的计数值
  276.   TIM4_CNTR = 0x00;            // 清除TIM4计数寄存器数值
  277.    
  278.   TIM4_SR_bit.UIF = 0;        //清除中断标志
  279.   TIM4_SR_bit.TIF = 0;
  280.   TIM4_CR1_bit.CEN = 1;       //使能定时器4计数
  281.   TIM4_CR1_bit.ARPE = 1;      //使能预装载
  282.   TIM4_IER_bit.UIE = 1;       // 使能更新中断
  283. }

  284. /****   本例中未使用    *******************************************************
  285. **函数名称:void TIM2_Init()
  286. **功能描述:定时器2参数初始化
  287. **入口参数:无
  288. **输出:无
  289. *******************************************************************************/
  290. void TIM2_Init()
  291. {
  292.   TIM2_PSCR = 0x00;     //定时器2预分频数为 1 分频,即定时器时钟 = 系统时钟 = 16MHz
  293.   TIM2_ARRH = 0x3E;     //设置1毫秒时间自动重载 16000 = 0x3e80
  294.   TIM2_ARRL = 0x80;     //

  295.   TIM2_CNTRH = 0x00;    //清除计数寄存器
  296.   TIM2_CNTRL = 0x00;    //
  297.   TIM2_SR1 = 0x00;      //清除所有的中断标志

  298. }

  299. /****   本例中未使用    ******************************************************
  300. **函数名称:void TIM2_DelayMs(unsigned int ms)
  301. **功能描述:定时器2参进行精确延时,最小为1毫秒,最大65535
  302. **入口参数:unsigned int ms     1=< ms <= 65535
  303. **输出:无
  304. *******************************************************************************/
  305. void TIM2_DelayMs(unsigned int ms)
  306. {
  307.    
  308.     TIM2_CR1 = 0x81;        //启动定时器2开始计数
  309.     while(ms--)
  310.     {
  311.       
  312.       while( !(TIM2_SR1 & 0x01)); //等待计数是否达到1毫秒
  313.       TIM2_SR1 &= ~(0x01);  //计数完成1毫秒,清除相应的标志
  314.     }
  315.      TIM2_CR1 = 0x00;       //延时全部结束,关闭定时器2
  316. }

  317. /*******************************************************************************
  318. **函数名称:void delay(unsigned int ms)
  319. **功能描述:大概延时
  320. **入口参数:unsigned int ms   输入大概延时数值
  321. **输出:无
  322. *******************************************************************************/
  323. void delay(unsigned int ms)
  324. {
  325.   unsigned int x , y;
  326.   for(x = ms; x > 0; x--)           /*  通过一定周期循环进行延时*/
  327.     for(y = 1000 ; y > 0 ; y--);
  328. }

  329. /*******************************************************************************
  330. **函数名称:void V_Show()
  331. **功能描述:在数码管上显示电压值
  332. **入口参数:ms:每个数码管延时。显示数据存储在 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点
  339.   PD_ODR &=0xef;    //PD4置低 V百位选通
  340.   delay(ms);
  341.   SMG1_Display(ADCBuff[1]);   //显示V十位
  342.   if(vDotPS==1) PC_ODR |=0x20;    //PC5置高,h点
  343.   PD_ODR &=0xbf;    //PD6置低 V十位选通
  344.   delay(ms);
  345.   SMG1_Display(ADCBuff[0]);   //显示V个位
  346.   PD_ODR &=0xdf;    //PD5置低 V个位选通
  347.   delay(ms);
  348. }

  349. /*******************************************************************************
  350. **函数名称:void I_Show()
  351. **功能描述:在数码管上显示电流值
  352. **入口参数:ms:每个数码管延时。显示数据存储在 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点
  359.   PB_ODR &=0xdf;    //PB5置低,I百位选通
  360.   delay(ms);
  361.   SMG1_Display(ADCBuff[4]);   //显示A十位
  362.   if(cDotPS==4) PC_ODR |=0x20;    //PC5置高,h点
  363.   PB_ODR &=0xe0;    //PB4置低,I十位选通
  364.   delay(ms);
  365.   SMG1_Display(ADCBuff[3]);   //显示A个位
  366.   PA_ODR &=0xfd;    //PA1置低,I个位选通
  367.   delay(ms);
  368. }


  369. /*    主函数    */
  370. int main(void)
  371. {
  372.   //asm("sim");             //关闭系统总中断
  373.   CLK_CKDIVR = 0x00;      //CPUDIV = 1 HSIDIV = 1  内部时钟 = 16Mhz
  374.   GPIO_Init0();
  375.   ADC_Init();             //调用ADC初始化函数
  376.   //TIM2_Init();
  377.   //Timer4Init();           //初始化定时器4
  378.   //asm("rim");             //打开系统总中断
  379.   while(1)
  380.   {
  381.     //if(adcflag == 1)                        //1秒定时时间到对使能ADC进行采样
  382.     //{
  383.       //asm("sim");                           //关系统总中断

  384.     voltRAW = Ad_Av(4)[0];      //获取电压数据
  385.     if(vFlag==1){       //电压数据采集完成才进行以下计算,否则跳过,将显示上次数据
  386.       vFlag=0;
  387.       newData[0] = ProcessVoltage(voltRAW);
  388.       Noise_Filter(0.5, 0, preCoef, preTrend, ADvalue, newData);
  389.       //ADvalue[0] = newData[0];        //不要上面的滤波时使用
  390.       mV = (unsigned long)(ADvalue[0]*1000);
  391.       if(mV > 9999){
  392.         vDotPS=1;
  393.         ADCBuff[0] = mV / 100 % 10;     //0.1V
  394. ……………………

  395. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
STM8S_VIMeter.zip (1.16 MB, 下载次数: 773)



评分

参与人数 5黑币 +127 收起 理由
BigWheels + 6 很给力!
csy1991hf + 10 很给力!
wlxf + 1 刚好可以用到,多谢分享
qjzyx + 10 高手,向你学习!
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏62 分享淘帖 顶6 踩
回复

使用道具 举报

沙发
ID:55317 发表于 2018-1-16 11:35 | 只看该作者
多谢分享,好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:266116 发表于 2018-1-16 14:18 | 只看该作者
谢谢分享!
回复

使用道具 举报

地板
ID:98894 发表于 2018-1-21 19:27 | 只看该作者
谢谢分享
回复

使用道具 举报

5#
ID:98894 发表于 2018-1-21 19:27 | 只看该作者
不错,挺好的资料
回复

使用道具 举报

6#
ID:289512 发表于 2018-3-9 16:18 | 只看该作者
高手,谢谢楼主的分享。。。。。
回复

使用道具 举报

7#
ID:296060 发表于 2018-4-9 17:01 | 只看该作者
感谢分享,学习下!!
回复

使用道具 举报

8#
ID:44037 发表于 2018-4-10 07:03 | 只看该作者
谢谢楼主的分享。。。学习  学习
回复

使用道具 举报

9#
ID:307026 发表于 2018-4-12 23:45 | 只看该作者
感谢分享
回复

使用道具 举报

10#
ID:314905 发表于 2018-4-24 13:36 | 只看该作者
感谢分享,电压表坏了可以修理了。
回复

使用道具 举报

11#
ID:202897 发表于 2018-6-7 13:22 | 只看该作者
楼主请教:输入VGain = 35,是如何计算的?tmpin * 3.3 * VGain / 1023
回复

使用道具 举报

12#
ID:202897 发表于 2018-6-7 14:11 | 只看该作者
看明白了,输入电压又被分压270/8.2=33,10K调节到软件设定35
回复

使用道具 举报

13#
ID:378605 发表于 2018-10-11 20:08 | 只看该作者
谢谢分享
回复

使用道具 举报

14#
ID:239055 发表于 2018-11-17 16:00 来自手机 | 只看该作者
我手上也有一个和你相似的电压电流模块,程序有没有编译好的?烧写用什么软件?
回复

使用道具 举报

15#
ID:171207 发表于 2018-11-29 11:55 | 只看该作者

好东西要学习
回复

使用道具 举报

16#
ID:437372 发表于 2018-12-1 21:23 | 只看该作者
多谢分享,好资料,51黑有你更精彩!!!
回复

使用道具 举报

17#
ID:246635 发表于 2018-12-5 20:26 | 只看该作者
谢谢分享,我能直接照做一个吧
回复

使用道具 举报

18#
ID:149992 发表于 2018-12-25 16:05 | 只看该作者
多谢分享,好资料,51黑有你更精彩!!!
回复

使用道具 举报

19#
ID:149992 发表于 2018-12-30 14:20 | 只看该作者
去某宝买了这个一样的表,到手居然MCU居然换成了新唐芯片,自己动手换芯片,换芯片后显示正常,但是测量USB5v电压个位数跳的厉害。
回复

使用道具 举报

20#
ID:466148 发表于 2019-1-19 17:44 来自手机 | 只看该作者
请问如果想还输出一路pwm,要用那个脚可以用?本人刚接触stm8,菜鸟中的雏鸟,望不要见笑。
回复

使用道具 举报

21#
ID:104974 发表于 2019-1-31 15:59 | 只看该作者
刚好可以用到,多谢分享!
回复

使用道具 举报

22#
ID:33899 发表于 2019-2-27 09:17 | 只看该作者
楼主厉害,需要里面的滤波函数,学习学习楼主
回复

使用道具 举报

23#
ID:33899 发表于 2019-2-27 09:21 | 只看该作者
就是有点贵啊
回复

使用道具 举报

24#
ID:33899 发表于 2019-2-27 19:50 | 只看该作者
很好用,滤波函数已经移植到我的软件里面,效果很明显,如下图

8a06e681e54af0857ba03a563e4a0f8.png (36.51 KB, 下载次数: 130)

8a06e681e54af0857ba03a563e4a0f8.png
回复

使用道具 举报

25#
ID:488256 发表于 2019-3-11 01:09 | 只看该作者
感谢分享~正需要学习下!
回复

使用道具 举报

26#
ID:488949 发表于 2019-3-13 03:43 来自手机 | 只看该作者
我这个单片机芯片型号被可恶的商家搽掉了!跟你说的差不多。电压还行,电流不回零。重新刷代码行吗?
回复

使用道具 举报

27#
ID:489675 发表于 2019-3-13 09:17 来自手机 | 只看该作者
谢谢楼主,下载了
回复

使用道具 举报

28#
ID:490467 发表于 2019-3-14 10:01 | 只看该作者
很好的教程说明,感谢,可以多多学习了
回复

使用道具 举报

29#
ID:466148 发表于 2019-3-15 17:21 来自手机 | 只看该作者
我买的芯片型号也擦掉了,按stm8s003、103都读不了,关键是联系不上设备,还有办法吗?
回复

使用道具 举报

30#
ID:499770 发表于 2019-3-29 21:29 | 只看该作者
谢谢楼主的分享
回复

使用道具 举报

31#
ID:236621 发表于 2019-4-3 23:36 | 只看该作者
谢谢分享
回复

使用道具 举报

32#
ID:149630 发表于 2019-4-19 20:45 | 只看该作者
感谢,学习了
回复

使用道具 举报

33#
ID:275144 发表于 2019-4-24 10:23 | 只看该作者

请问大师们,按上图原理图电压表头怎么没电压显示呢
回复

使用道具 举报

34#
ID:536468 发表于 2019-5-13 13:13 | 只看该作者
lixianshen 发表于 2019-3-15 17:21
我买的芯片型号也擦掉了,按stm8s003、103都读不了,关键是联系不上设备,还有办法吗?

因为供电的问题吗
回复

使用道具 举报

35#
ID:536468 发表于 2019-5-13 14:52 | 只看该作者
lixianshen 发表于 2019-1-19 17:44
请问如果想还输出一路pwm,要用那个脚可以用?本人刚接触stm8,菜鸟中的雏鸟,望不要见笑。

请问可以吗重新输出?
回复

使用道具 举报

36#
ID:536468 发表于 2019-5-13 14:53 | 只看该作者
lixianshen 发表于 2019-3-15 17:21
我买的芯片型号也擦掉了,按stm8s003、103都读不了,关键是联系不上设备,还有办法吗?

这个板子接到电脑上的接线图可以分享一下吗谢谢
回复

使用道具 举报

37#
ID:536468 发表于 2019-5-13 14:54 | 只看该作者
请问这个板子怎么接到电脑上进行烧录啊
回复

使用道具 举报

38#
ID:541986 发表于 2019-5-19 16:15 | 只看该作者
好资料,谢谢分享!
回复

使用道具 举报

39#
ID:510119 发表于 2019-5-27 15:55 | 只看该作者
ccy1231 发表于 2019-4-24 10:23
请问大师们,按上图原理图电压表头怎么没电压显示呢

你也在弄这个电压电流表吗,我试了,不能用
回复

使用道具 举报

40#
ID:56665 发表于 2019-5-27 17:52 | 只看该作者
谢谢楼主的分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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