- #include "sys.h"
- #include "delay.h"
- #include "tim1.h"
- #include "pwm.h"
- #include "stdio.h"
- #include "usart.h"
- //#include "key.h"
- #include "iic.h"
- #include "adc.h"
- #include "LCD12864.h"
- #include "rs485.h"
- #include "Lin.h"
- #include "TLE7209.h"
- #include "dma.h"
- #define ID 0X30
- #define SEND_BUF_SIZE 40 //發送數據長度,最好等于sizeof(TEXT_TO_SEND)+2的整數倍.
- u8 SendBuff[SEND_BUF_SIZE]; //發送數據緩沖區
- u8 TEXT_TO_SEND[]={'D','C',50,51,52,53,54,56,49,50,51,52,53,54,56,49,50,51,52,'m'};
- u16 pwm[]={10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300,310,320,330,340,350,360,370,380,390,400,510,520,530,540,550,560,570,580,590,600,610,620,630,640,650,660,670,680,690,700,
- 810,820,830,840,850,860,870,880,890,900,910,920,930,940,950,960,970,980,990,1000};
- u16 pwm_wal;
- u8 C[20];
- u32 Time,Cylce;
- u16 data_flag=1;
- u16 RS485[900];
- u16 RS485_data[300];
- u16 R_CURVE[300];
- u8 Cur_Addr[] = { 0x95, 0x8D, 0X9D };
- u8 rs485buf2[20] ;
- u8 Address_number;
- u16 Air_flow_high8bit = 0, Air_flow_low8bit = 0, Air_flow_CRC = 0;
- u32 flowdata = 0, mearsured_flowdata = 0, flow_date_H, flow_date_D, flow_date_S,flow_date_S_1, flow_date_S_2;
- u32 traget_speed_10000, traget_speed_1000, traget_speed_100, traget_speed_10,traget_speed_1;
- u32 actual_speed_10000, actual_speed_1000, actual_speed_100, actual_speed_10,actual_speed_1;
- u32 supply_voltage_10, supply_voltage_1;
- u32 supply_current_100, supply_current_10, supply_current_1;
- u32 temperature_100, temperature_10, temperature_1;
- u32 Analog_IN0_1000, Analog_IN0_100, Analog_IN0_10, Analog_IN0_1;
- u8 num, addr = 0;
- u16 AA, BB, CC;
- int Number_value =0;
- int Received_Number_value = 200;
- u8 TIM4CH1_CAPTURE_STA=0; //輸入捕獲狀態
- u16 TIM4CH1_CAPTURE_VAL,CAP_F; //輸入捕獲值
- u32 T;
- u32 duty;
- u8 key = 0;
- u16 Total_time,len,t,times,totaldata;
- u32 app_cycle = 0;
- u16 Counter = 0;
- unsigned int rs485buf[6], rs485buf1[60];
- float Temp=1, Temp1, Pre_error = 0, Pre_Derror = 0, V_kp = 440, V_ki = 0.000001,V_kd = 0, V_change = 0, Volaegre_set = 4.2;
- int V_value, V_value1, pwm_number = 50, pwm_number1 = 50, Cursor_flag = 0,KEY_Up_flag = 0, KEY_Down_flag = 0, ALL_DATA = 0, Temp2 = 0, Temp3 = 0;
- float error1, d_error, dd_error;
- int teatdata = 1, teatdata1 = 1, readdata = 1000, valueall = 1000, second = 0,second1 = 0, minute = 0, hour = 0, minute1 = 0, hour1 = 0;
- unsigned char value1, value2;
- unsigned long int Sin1[] = { 100,200 };
- unsigned int kk, flag_break, Pump_speed1 = 500, Pump_speed2 = 500,Pump_speed1_VIEW = 0, Pump_speed2_VIEW = 0, Number_value_VIEW;
- unsigned int traget_speed = 0, actual_speed = 0, traget_speed1 = 0,actual_speed1 = 0, supply_voltage1 = 0, supply_current1 = 0,temperature1, voltage_status = 0, speed_status = 0, current_status = 0,
- temperature_status = 0, roling_counter = 0, Stall_detection_status = 0,block_eeeor = 0, inter_error = 0, Response_error;
- unsigned long int Error_sattus = 0, running_mode = 0, position_feedback = 0,move_status = 0, speed_level = 0, Temperature_status = 0,
- supply_voltage_status = 0, Lin_communication_status = 0;
- float Analog_IN0 = 0, Analog_IN00 = 0, MMM, MMMM, MMMMM, supply_voltage = 0,supply_current, temperature, Analog_IN2 = 0;
- unsigned long int change1, change2, Set_point, position = 0xff, cycle;
- float T_temp=0,T_temp_T=1,T_last_temp;
- void lcd_sfm(unsigned int add, int data) //顯示位置和數據
- {
- unsigned char qian, bai, shi, ge;
- qian = data / 1000;
- bai = (data - qian * 1000) / 100;
- shi = (data - qian * 1000 - bai * 100) / 10;
- ge = (data - qian * 1000 - bai * 100 - shi * 10) % 10;
- Write_Com(add);
- //Write_Date(0x30 + qian);
- Write_Date(0x30 + bai);
- Write_Date(0x30 + shi);
- Write_Date(0x2e);
- Write_Date(0x30 + ge);
- }
- void lcd2_sfm(unsigned char add, int data) //顯示位置和數據
- {
- unsigned char qian, bai, shi, ge;
- qian = data / 1000;
- bai = (data - qian * 1000) / 100;
- shi = (data - qian * 1000 - bai * 100) / 10;
- ge = (data - qian * 1000 - bai * 100 - shi * 10) % 10;
- Write_Com(add);
- //Write_Date(0x30 + 0);
- //Write_Date(0x30 + qian);
- //Write_Date(0x30 + bai);
- //Write_Date(0x30 + shi);
- Write_Date(0x30 + ge);
- }
- void lcd3_sfm(unsigned char add, int data) //顯示位置和數據
- {
- unsigned char wan, qian, bai, shi, ge;
- wan = data / 10000;
- qian = (data - wan * 10000) / 1000;
- bai = (data - wan * 10000 - qian * 1000) / 100;
- shi = (data - wan * 10000 - qian * 1000 - bai * 100) / 10;
- ge = (data - wan * 10000 - qian * 1000 - bai * 100 - shi * 10) % 10;
- Write_Com(add);
- Write_Date(0x30 + wan);
- Write_Date(0x30 + qian);
- Write_Date(0x30 + bai);
- Write_Date(0x30 + shi);
- Write_Date(0x30 + ge);
- }
- void lcd1_sfm(unsigned char add, int data) //顯示位置和數據
- {
- unsigned char qian, bai, shi, ge;
- qian = 0;
- bai = (data - qian * 1000) / 100;
- shi = (data - qian * 1000 - bai * 100) / 10;
- ge = (data - qian * 1000 - bai * 100 - shi * 10) % 10;
- Write_Com(add);
- Write_Date(0x30 + qian);
- Write_Date(0x2e);
- Write_Date(0x30 + bai);
- Write_Date(0x30 + shi);
- Write_Date(0x30 + ge);
- }
- float Voltage_PID(float Volatage_ref, float Voltage_back) {
- float error2;
- AA = Get_Adc_Average(8, 10);
- //Temp =AA*3.3*10/4096;;
- //Temp = ((USART_RX_BUF[0]-48)*10+USART_RX_BUF[1]-48)/10;
- Temp =3;
- BB = Get1_Adc_Average(9, 40);
- Temp1 = BB * 3.3 * 2 / 4096;
- error1 = Volatage_ref - Voltage_back;
- d_error += error1;
- Pre_error = error1 - error2;
- error2 = error1;
- if ((error1 >= -5) && (error1 < 5))
- {
- V_change = V_kp * error1 + V_ki * d_error + V_kd * Pre_error;
- }
- return (V_change);
- }
- void TIM4_Capture_Init(u16 arr,u16 psc)
- {
- RCC->APB1ENR|=1<<2; //TIM4 時鐘使能
- RCC->APB2ENR|=1<<3; //使能PORTb時鐘
- GPIOB->CRH&=0XFFFFFF0F; //Pb9 清除之前設置
- GPIOB->CRH|=0X00000080; //PB9 輸入
- GPIOB->ODR|=1<<9; //PB9 下拉
- TIM4->ARR=arr; //設定計數器自動重裝值
- TIM4->PSC=psc; //預分頻器
- TIM4->CCMR2|=1<<8; //CC1S=01 選擇輸入端 IC1映射到TI1上
- TIM4->CCMR2|=0<<12; //IC1F=0000 配置輸入濾波器 不濾波
- TIM4->CCMR2|=0<<10; //IC2PS=00 配置輸入分頻,不分頻
- TIM4->CCER|=0<<13; //CC1P=0 上升沿捕獲
- TIM4->CCER|=1<<12; //CC1E=1 允許捕獲計數器的值到捕獲寄存器中
- TIM4->DIER|=1<<4; //允許捕獲中斷
- TIM4->DIER|=1<<0; //允許更新中斷
- TIM4->CR1|=0x01; //使能定時器4
- MY_NVIC_Init(1,3,TIM4_IRQn,2);//搶占0,響應0,組2
- }
- void TIM3_Int_Init(u16 arr, u32 psc) {
- RCC->APB1ENR |= 1 << 1; //TIM3時鐘使能
- TIM3->ARR = arr; //設定計數器自動重裝值//剛好1ms
- TIM3->PSC = psc; //預分頻器7200,得到10Khz的計數時鐘
- TIM3->DIER |= 1 << 0; //允許更新中斷
- TIM3->CR1 |= 0x01; //使能定時器3
- MY_NVIC_Init(3, 2, TIM3_IRQn, 2); //搶占31,子優先級23,組2
- }
- void TIM2_PWM_Init(u16 arr, u32 psc) {
- RCC->APB1ENR |= 1 << 0; //TIM23時鐘使能
- TIM2->ARR = arr; //設定計數器自動重裝值//剛好1ms
- TIM2->PSC = psc; //預分頻器7200,得到10Khz的計數時鐘
- TIM2->DIER |= 1 << 0; //允許更新中斷
- TIM2->CR1 |= 0x01; //使能定時器3
- MY_NVIC_Init(1, 3, TIM2_IRQn, 2); //搶占1,子優先級3,組2
- }
- //............12864 Course view............//
- void Dis_Cur() {
- Write_Com(Cur_Addr[Address_number]);
- delay_ms(100);
- Write_Com(0x0e);
- delay_ms(100);
- Write_Com(0x0C);
- }
- int main(void) {
- u16 i;
- u8 t=0;
- u8 j,mask=0;
- Stm32_Clock_Init(9); //系統時鐘設置
- delay_init(72);
- uart1_init(72, 19200); //串口初始化為115200
- uart2_init(36, 9600); //串口初始化為115200
- KEY_Init();
- PWM_Init();
- Adc_Init();
- Init_12864();
- Init_TLE7209();
- IIC_Init();
- TLE7209_SCK = 1;
- TLE7209_CS = 1;
- TLE7209_DIS = 0;
- TLE7209_EN = 1;
- LCD12864xie(0,0,"GPA Control Box");
- LCD12864xie(0,1,"SP:");
- LCD12864xie(4,1,"FP:");
- TIM3_Int_Init(1000, 71); //10Khz的計數頻率,計數5K次為500ms
- TIM4_Capture_Init(0XFFFF,71);
- TIM_Init(720, 999, 300);
- TIM2_PWM_Init(10000, 7199);
- i=0;
- while (1)
- { if(TIM4CH1_CAPTURE_STA&0X80)//成功捕獲到了一次上升沿
- {
- T_temp=TIM4CH1_CAPTURE_STA&0X3F;
- T_temp*=65536;//溢出時間總和
- T_temp+=TIM4CH1_CAPTURE_VAL;//得到總的高電平時間
- TIM4CH1_CAPTURE_STA=0;//開啟下一次捕獲
- if(CAP_F==1) {//整個周期
- T_temp_T=T_temp;
- T=(100000000/T_temp_T/100+0.5);//得到周期
- duty=(T_last_temp*100/T_temp_T+0.5);//得到占空比 duty%
- }
- CAP_F++;
- if(CAP_F>1)
- {CAP_F=0;//捕獲高電平時間和周期時間的轉換標志位
- }
- T_last_temp=T_temp;
- }
- TLE7209_CS = 1;
- TLE7209_SCK = 1;
- //Write_Com(0x01); //清屏
- TLE7209_SCK = 0; //一個脈沖保存數據
- TLE7209_CS = 0;
- delay_us(10);
- value1 = TLE7209SentByte(0x09);
- value2 = TLE7209SentByte(0x00);
- TLE7209_CS = 1;
- TLE7209_SCK = 1;
- delay_us(10);
- TLE7209_SCK = 0;
- TLE7209_CS = 0;
- delay_us(10);
- TLE7209_CS = 1;
- TLE7209_CS = 0;
- lcd_sfm(0x92, Temp1*20000);
- lcd_sfm(0x96, Temp*20000);
- lcd3_sfm(0x9a,duty);
- lcd3_sfm(0x9d, T);
- if (value1 != 255)
- {
- TLE7209_EN = 0;
- delay_us(10);
- TLE7209_EN = 1;
- delay_us(10);
- }
- }
- }
- //定時器5中斷服務程序
- void TIM4_IRQHandler(void)
- {
- u16 tsr;
- tsr=TIM4->SR;
- if((TIM4CH1_CAPTURE_STA&0X80)==0)//還未成功捕獲
- {if(tsr&0X01)//溢出
- {
- if(TIM4CH1_CAPTURE_STA&0X40)//已經捕獲到高電平了
- {
- if((TIM4CH1_CAPTURE_STA&0X3F)==0X3F)//高電平太長了
- {
- TIM4CH1_CAPTURE_STA|=0X80;//標記成功捕獲了一次
- TIM4CH1_CAPTURE_STA=0XFFFF;
- }else TIM4CH1_CAPTURE_STA++;
- }
- }
- if(tsr&(1<<4))
- {
- if(TIM4CH1_CAPTURE_STA&0X40) //捕獲到一個下降沿
- {
- TIM4CH1_CAPTURE_STA|=0X80; //標記成功捕獲到一次高電平脈寬
- TIM4CH1_CAPTURE_VAL=TIM4->CCR4; //獲取當前的捕獲值.
- TIM4->CCER&=~(1<<13); //CC1P=0 設置為上升沿捕獲
- }else //還未開始,第一次捕獲上升沿
- {
- TIM4CH1_CAPTURE_STA=0; //清空
- TIM4CH1_CAPTURE_VAL=0;
- TIM4->CNT=0;
- TIM4CH1_CAPTURE_STA|=0X40; //標記捕獲到了上升沿
- if(CAP_F==0)
- TIM4->CCER|=1<<13; //CC1P=1 設置為下降沿捕獲
- else
- TIM4->CCER&=~(1<<13); //CC1P=0 設置為上升沿捕獲
- }
- }
- }
- TIM4->SR=0;//清除中斷標志位
- }
- void TIM2_IRQHandler(void) {
- if (TIM2->SR & 0X0001) //溢出中斷
- {pwm_number = 0.1 * pwm_number + 0.6*Voltage_PID(Temp, Temp1);
- if (pwm_number < -50) {
- pwm_number = -50;
- }
- if (pwm_number > 50) {
- pwm_number = 50;
- }
- pwm_number1 = 50 + pwm_number;
- pwm_wal++;
- if(pwm_wal>=89)
- {pwm_wal=0;}
- TIM_Init(720, 999, pwm[pwm_wal]);
- }
- TIM2->SR &= ~(1 << 0); //清除中斷標志位
- }
復制代碼
僅僅提供Eclipse代碼下載,僅供參考,可能有錯:
GPA Control box - Test.7z
(332.17 KB, 下載次數: 11)
2023-6-13 03:37 上傳
點擊文件名下載附件
通用執行器控制
|