找回密码
 立即注册

QQ登录

只需一步,快速开始

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

2015年电赛STM32程序 电流电压采集

  [复制链接]
跳转到指定楼层
楼主
ID:511461 发表于 2019-7-23 09:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用了外设的LCD以及迷你版自带的LCD两种方案,以下是外设的程序

单片机源程序如下:

  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "adc.h"
  5. #include "timer.h"
  6. #include "stdio.h"
  7. #include "key.h"
  8. #include "lcd.h"
  9. #include "usart.h"        
  10. #include "led.h"
  11. #include "dac.h"
  12. #include "pid.h"

  13. /* Private variables ---------------------------------------------------------*/
  14. extern __IO uint32_t ADC_DualConvertedValueTab[10][4];
  15. extern float b;


  16. float V[50] = {0},I[50] = {0},t[50] = {0},m[50] = {0};
  17. float Vaver,Iaver,temp ,Iaver1, Iaver2,Vaver2;
  18. float K = 800;
  19. u8 g_ADCflag = 0;
  20. u16 g_adc = 0;
  21. signed g_fbase = 30;
  22. u8 Iflag = 1;
  23. u32 a=0;
  24. u8 keyvalue=0;
  25. float Vsum = 0,Isum = 0,tsum = 0,msum = 0;
  26. float Vmin = 3.3,Imin = 0,tmin = 0,mmin = 0;
  27. float Vmax = 0,Imax = 0,tmax=0,mmax = 0;
  28. u16  dacval=2160;
  29. float dianya;
  30. u16 j = 0;
  31. u16 adcx;
  32. u8  string[]={"    "};
  33. u8  string1[]={"    "};
  34. u8  string2[]={"    "};        
  35. u8  string3[]={"    "};
  36. u8  string4[]={"    "};
  37. u8  string5[]={"    "};

  38. void NVIC_Configuration(void)
  39. {
  40.                 NVIC_InitTypeDef NVIC_InitStructure;
  41.         
  42.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  43.         
  44.                 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;          //定时器2优先级最高
  45.                 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  46.                 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        
  47.                 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  48.                 NVIC_Init(&NVIC_InitStructure);        
  49. }
  50. float ADaverage(u8 N)
  51. {
  52.                 float sum=0;
  53.                 u8 i= 0;
  54.                 for(i=0;i<10;i++)
  55.                 {
  56.                         sum = sum + (float)(ADC_DualConvertedValueTab[i][N]/4096.0 * 3.3);
  57.                 }
  58.                 return (sum/10.0);
  59. }

  60. int main(void)
  61. {                        
  62.                         delay_init();            //延时函数初始化         
  63.                         uart_init(9600);                 //串口初始化为9600        
  64.       Lcd_Init();                        //初始化OLED         
  65.       LED_Init();        
  66.              KEY_Init();                //按键初始化                                 
  67.                         ADCs_Init();      //初始化ADC        
  68.                         Timer_Init();  //20ms定时器
  69.                         NVIC_Configuration();          //设置NVIC中断分组        
  70.                         Dac1_Init();
  71.       PIDInit ();
  72.       PIDInit2 ();        
  73.       LCD_Clear(WHITE);
  74.             BACK_COLOR=WHITE;
  75.       DAC_SetChannel1Data(DAC_Align_12b_R, 2160);//????0                                
  76.             while(1)
  77.                         {                                
  78.                                         LCD_ShowString(8,0,"pid:",RED);        
  79.                                         LCD_ShowString(8,20,"temp:",RED);        
  80.                                         LCD_ShowString(8,40,"Vaver:",RED);
  81.                                         LCD_ShowString(8,60,"Iaver:",RED);        
  82.                                         LCD_ShowString(8,80,"DAC:",RED);        
  83.                                         LCD_ShowString(8,100,"dianya:",RED);
  84.                                         LCD_ShowString(8,120,"Vaver2:",RED);        

  85.                                         keyvalue = KEY_Scan(0);//读取按键值                                
  86.                                         if(keyvalue ==KEY0_PRES)//设定电压减1Hz  B5
  87.                                         {
  88.                                                  b=b-0.005;
  89.                                         }                        
  90.                                         else if(keyvalue ==KEY1_PRES)//设定电压减1Hz  B3
  91.                                         {
  92.                                                 if(dacval>65)   dacval=dacval-65;
  93.             DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//??DAC?               
  94.                                         }
  95.                                    else if(keyvalue ==WKUP_PRES)//设定电压减1Hz  B3
  96.                                         {
  97.                                                 if(dacval<4092)   dacval=dacval+65;
  98.             DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//??DAC?        
  99.                                         }        
  100.                                         sprintf((char*)string, "%.3f", b);        //显示电压值
  101.                                         LCD_ShowString(74,0,string,RED);        
  102.                                          
  103.                                         adcx=DAC_GetDataOutputValue(DAC_Channel_1);//??????DAC??
  104.                                         LCD_ShowNum(74,80,adcx,4,RED);
  105.                                         dianya=(float)adcx*(3.3/4096);                        //得到DAC电压值
  106.                                         sprintf((char*)string3, "%.3f", dianya);        //显示电压值
  107.                                         LCD_ShowString(74,100,string3,RED);        
  108.                                        
  109.                                         if(g_ADCflag==1)//采集到50个电压电流值进行处理
  110.                                         {        
  111.                                                                 Vsum = 0;Vmin = 3.3;Vmax = 0;
  112.                                                                 Isum = 0;Imin = 3.3;Imax = 0;
  113.                 tsum = 0;tmin = 3.3;tmax = 0;
  114.                 msum = 0;mmin = 3.3;mmax = 0;                                                        
  115.                                                                 for(j=0;j<50;j++)
  116.                                                                 {
  117.                                                                         Vsum = Vsum + V[j];
  118.                                                                         if(V[j] < Vmin)        Vmin = V[j];
  119.                                                                         if(V[j] > Vmax)        Vmax = V[j];

  120.                                                                         Isum = Isum + I[j];
  121.                                                                         if(I[j] < Imin)        Imin = I[j];
  122.                                                                         if(I[j] > Imax)        Imax = I[j];
  123.                                                                         
  124.                                                                         tsum = tsum + t[j];
  125.                                                                         if(t[j] < tmin)        tmin = t[j];
  126.                                                                         if(t[j] > tmax)        tmax = t[j];
  127.                                                                         
  128.                                                                         msum = msum + m[j];
  129.                                                                         if(m[j] < mmin)        mmin = m[j];
  130.                                                                         if(m[j] > mmax)        mmax = m[j];
  131.                                                                 }               
  132.                                                                 Vaver =(Vsum - Vmin - Vmax)/48;//去最大值最小值后平均
  133.                                                                 Iaver =(Isum - Imin - Imax)/48;//去最大值最小值后平均
  134.                                                                 temp =(tsum - tmin - tmax)/48;//去最大值最小值后平均
  135.                                                                 Vaver2 =(msum - mmin - mmax)/48;//去最大值最小值后平均
  136.                                                                
  137.                                                                 Iaver1= Iaver * 0.913;
  138.                                                                 Iaver2=Iaver1 - 0.6317;
  139.                                                                
  140.                                                                 if(Vaver>1.52 || Vaver<1.48) K =K + outPIDCalc(Vaver);//计算电压调制系数
  141.                                                                 if(K>990)                        K=990;//限幅处理
  142.                                                                 else if(K<300)        K = 300;        
  143.                                                                
  144.                                                                 if(temp<2.95)
  145.                                                                 {
  146.                                                                         GPIO_SetBits(GPIOA,GPIO_Pin_8);        
  147.                                                                         GPIO_ResetBits(GPIOD,GPIO_Pin_2);               
  148.                                                                 }
  149.                                                                 else if(temp>3.05)
  150.                                                                 {
  151.                                                                         GPIO_SetBits(GPIOD,GPIO_Pin_2);                                                  //PD.2 输出高
  152.                                                                         GPIO_ResetBits(GPIOA,GPIO_Pin_8);                                       
  153.                                                                 }
  154.                                                                
  155.                                                                 if(Vaver2>2.5)
  156.                                                                 {
  157.                                                                         GPIO_SetBits(GPIOC,GPIO_Pin_4);               
  158.                                                                 }
  159.                                                                 else GPIO_ResetBits(GPIOC,GPIO_Pin_4);
  160.                                                                
  161.                                                                 sprintf((char*)string1, "%.3f", temp);                        //显示设定电流值                                   
  162.                                                                 LCD_ShowString(74,20,string1,RED);
  163.                                                                 sprintf((char*)string2, "%.3f", Vaver);        //显示电压值
  164.                                                                 LCD_ShowString(74,40,string2,RED);                                                         
  165.                                                                 sprintf((char*)string4, "%.3f", Iaver2);        //显示电压值
  166.                                                                 LCD_ShowString(74,60,string4,RED);                                                         
  167.                                                                 sprintf((char*)string5, "%.3f", Vaver2);        //显示电压值
  168.                 LCD_ShowString(74,120,string5,RED);                                                               
  169. //                                                          sprintf((char*)string, "%d", Iflag);                        //显示设定电流值        
  170. //                LCD_ShowString(100,110,200,16,16,string);        
  171.                                                                                                                                 
  172.                                                                 g_ADCflag = 0;        g_adc = 0;        //标志位置0                                                                                       
  173.                                         }
  174. //                                LCD_Clear(WHITE);
  175.                     delay_ms(40);
  176.                 }
  177. }

  178. void TIM3_IRQHandler(void)
  179. {
  180.         if ( TIM_GetITStatus(TIM3 , TIM_IT_Update) != RESET )
  181.         {        
  182.                 if(g_adc < 50)//电流电压采集
  183.                 {
  184.                         V[g_adc] = ADaverage(0);
  185.                         I[g_adc] = ADaverage(1);
  186.       t[g_adc] = ADaverage(2);
  187.                         m[g_adc] = ADaverage(3);
  188.                               
  189.                         g_adc++;
  190.                 }
  191.                 else if(g_adc >=50)
  192.                         g_ADCflag = 1;                                                
  193.         TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update);
  194. }        
  195. }
复制代码

所有程序51hei提供下载:
2015 E-OLED.7z (223.08 KB, 下载次数: 105)


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

使用道具 举报

沙发
ID:1 发表于 2019-7-24 03:52 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:511461 发表于 2019-7-24 10:15 | 只看该作者
电路原理图就是第一张图片,源码也已分享,再补一个LCD的
回复

使用道具 举报

地板
ID:511461 发表于 2019-7-24 10:16 | 只看该作者
这是迷你版自带的LCD的程序

2015 E - LCD.7z

251.83 KB, 下载次数: 18, 下载积分: 黑币 -5

回复

使用道具 举报

5#
ID:511461 发表于 2019-7-25 08:17 | 只看该作者
这是STM32自带的LCD

2015 E - LCD.7z

251.83 KB, 下载次数: 23, 下载积分: 黑币 -5

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:420744 发表于 2019-7-30 10:06 | 只看该作者
aaaaaa。 发表于 2019-7-24 10:15
电路原理图就是第一张图片,源码也已分享,再补一个LCD的

图有点模糊可以发成文件形式吗
回复

使用道具 举报

7#
ID:696302 发表于 2020-3-10 11:53 | 只看该作者
标记一下 等着学习~~~~~~
回复

使用道具 举报

8#
ID:574873 发表于 2020-3-10 15:16 | 只看该作者
还是很强大的哦,标记下,以后学习
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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