- #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)
|