|
用了外設(shè)的LCD以及迷你版自帶的LCD兩種方案,以下是外設(shè)的程序
QQ圖片20190723083621.png (66.29 KB, 下載次數(shù): 60)
下載附件
2019-7-23 09:48 上傳
QQ圖片20190721200457.png (54.12 KB, 下載次數(shù): 35)
下載附件
2019-7-23 09:48 上傳
單片機(jī)源程序如下:
- #include "stm32f10x.h"
- #include "delay.h"
- #include "sys.h"
- #include "adc.h"
- #include "timer.h"
- #include "stdio.h"
- #include "key.h"
- #include "lcd.h"
- #include "usart.h"
- #include "led.h"
- #include "dac.h"
- #include "pid.h"
- /* Private variables ---------------------------------------------------------*/
- extern __IO uint32_t ADC_DualConvertedValueTab[10][4];
- extern float b;
- float V[50] = {0},I[50] = {0},t[50] = {0},m[50] = {0};
- float Vaver,Iaver,temp ,Iaver1, Iaver2,Vaver2;
- float K = 800;
- u8 g_ADCflag = 0;
- u16 g_adc = 0;
- signed g_fbase = 30;
- u8 Iflag = 1;
- u32 a=0;
- u8 keyvalue=0;
- float Vsum = 0,Isum = 0,tsum = 0,msum = 0;
- float Vmin = 3.3,Imin = 0,tmin = 0,mmin = 0;
- float Vmax = 0,Imax = 0,tmax=0,mmax = 0;
- u16 dacval=2160;
- float dianya;
- u16 j = 0;
- u16 adcx;
- u8 string[]={" "};
- u8 string1[]={" "};
- u8 string2[]={" "};
- u8 string3[]={" "};
- u8 string4[]={" "};
- u8 string5[]={" "};
- void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
-
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //定時(shí)器2優(yōu)先級最高
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- float ADaverage(u8 N)
- {
- float sum=0;
- u8 i= 0;
- for(i=0;i<10;i++)
- {
- sum = sum + (float)(ADC_DualConvertedValueTab[i][N]/4096.0 * 3.3);
- }
- return (sum/10.0);
- }
- int main(void)
- {
- delay_init(); //延時(shí)函數(shù)初始化
- uart_init(9600); //串口初始化為9600
- Lcd_Init(); //初始化OLED
- LED_Init();
- KEY_Init(); //按鍵初始化
- ADCs_Init(); //初始化ADC
- Timer_Init(); //20ms定時(shí)器
- NVIC_Configuration(); //設(shè)置NVIC中斷分組
- Dac1_Init();
- PIDInit ();
- PIDInit2 ();
- LCD_Clear(WHITE);
- BACK_COLOR=WHITE;
- DAC_SetChannel1Data(DAC_Align_12b_R, 2160);//????0
- while(1)
- {
- LCD_ShowString(8,0,"pid:",RED);
- LCD_ShowString(8,20,"temp:",RED);
- LCD_ShowString(8,40,"Vaver:",RED);
- LCD_ShowString(8,60,"Iaver:",RED);
- LCD_ShowString(8,80,"DAC:",RED);
- LCD_ShowString(8,100,"dianya:",RED);
- LCD_ShowString(8,120,"Vaver2:",RED);
- keyvalue = KEY_Scan(0);//讀取按鍵值
- if(keyvalue ==KEY0_PRES)//設(shè)定電壓減1Hz B5
- {
- b=b-0.005;
- }
- else if(keyvalue ==KEY1_PRES)//設(shè)定電壓減1Hz B3
- {
- if(dacval>65) dacval=dacval-65;
- DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//??DAC?
- }
- else if(keyvalue ==WKUP_PRES)//設(shè)定電壓減1Hz B3
- {
- if(dacval<4092) dacval=dacval+65;
- DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//??DAC?
- }
- sprintf((char*)string, "%.3f", b); //顯示電壓值
- LCD_ShowString(74,0,string,RED);
-
- adcx=DAC_GetDataOutputValue(DAC_Channel_1);//??????DAC??
- LCD_ShowNum(74,80,adcx,4,RED);
- dianya=(float)adcx*(3.3/4096); //得到DAC電壓值
- sprintf((char*)string3, "%.3f", dianya); //顯示電壓值
- LCD_ShowString(74,100,string3,RED);
-
- if(g_ADCflag==1)//采集到50個(gè)電壓電流值進(jìn)行處理
- {
- Vsum = 0;Vmin = 3.3;Vmax = 0;
- Isum = 0;Imin = 3.3;Imax = 0;
- tsum = 0;tmin = 3.3;tmax = 0;
- msum = 0;mmin = 3.3;mmax = 0;
- for(j=0;j<50;j++)
- {
- Vsum = Vsum + V[j];
- if(V[j] < Vmin) Vmin = V[j];
- if(V[j] > Vmax) Vmax = V[j];
- Isum = Isum + I[j];
- if(I[j] < Imin) Imin = I[j];
- if(I[j] > Imax) Imax = I[j];
-
- tsum = tsum + t[j];
- if(t[j] < tmin) tmin = t[j];
- if(t[j] > tmax) tmax = t[j];
-
- msum = msum + m[j];
- if(m[j] < mmin) mmin = m[j];
- if(m[j] > mmax) mmax = m[j];
- }
- Vaver =(Vsum - Vmin - Vmax)/48;//去最大值最小值后平均
- Iaver =(Isum - Imin - Imax)/48;//去最大值最小值后平均
- temp =(tsum - tmin - tmax)/48;//去最大值最小值后平均
- Vaver2 =(msum - mmin - mmax)/48;//去最大值最小值后平均
-
- Iaver1= Iaver * 0.913;
- Iaver2=Iaver1 - 0.6317;
-
- if(Vaver>1.52 || Vaver<1.48) K =K + outPIDCalc(Vaver);//計(jì)算電壓調(diào)制系數(shù)
- if(K>990) K=990;//限幅處理
- else if(K<300) K = 300;
-
- if(temp<2.95)
- {
- GPIO_SetBits(GPIOA,GPIO_Pin_8);
- GPIO_ResetBits(GPIOD,GPIO_Pin_2);
- }
- else if(temp>3.05)
- {
- GPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2 輸出高
- GPIO_ResetBits(GPIOA,GPIO_Pin_8);
- }
-
- if(Vaver2>2.5)
- {
- GPIO_SetBits(GPIOC,GPIO_Pin_4);
- }
- else GPIO_ResetBits(GPIOC,GPIO_Pin_4);
-
- sprintf((char*)string1, "%.3f", temp); //顯示設(shè)定電流值
- LCD_ShowString(74,20,string1,RED);
- sprintf((char*)string2, "%.3f", Vaver); //顯示電壓值
- LCD_ShowString(74,40,string2,RED);
- sprintf((char*)string4, "%.3f", Iaver2); //顯示電壓值
- LCD_ShowString(74,60,string4,RED);
- sprintf((char*)string5, "%.3f", Vaver2); //顯示電壓值
- LCD_ShowString(74,120,string5,RED);
- // sprintf((char*)string, "%d", Iflag); //顯示設(shè)定電流值
- // LCD_ShowString(100,110,200,16,16,string);
-
- g_ADCflag = 0; g_adc = 0; //標(biāo)志位置0
- }
- // LCD_Clear(WHITE);
- delay_ms(40);
- }
- }
- void TIM3_IRQHandler(void)
- {
- if ( TIM_GetITStatus(TIM3 , TIM_IT_Update) != RESET )
- {
- if(g_adc < 50)//電流電壓采集
- {
- V[g_adc] = ADaverage(0);
- I[g_adc] = ADaverage(1);
- t[g_adc] = ADaverage(2);
- m[g_adc] = ADaverage(3);
-
- g_adc++;
- }
- else if(g_adc >=50)
- g_ADCflag = 1;
- TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update);
- }
- }
復(fù)制代碼
所有程序51hei提供下載:
2015 E-OLED.7z
(223.08 KB, 下載次數(shù): 107)
2019-7-24 03:49 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|