久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
Eclipse工程 STM32單片機通用執行器控制程序 節氣門控制
[打印本頁]
作者:
lzj666666
時間:
2023-6-12 10:32
標題:
Eclipse工程 STM32單片機通用執行器控制程序 節氣門控制
#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 上傳
點擊文件名下載附件
通用執行器控制
作者:
liufeng180840
時間:
2023-6-20 11:58
根本就打不開,不完整,懷疑你從哪里抄來的
作者:
Hephaestus
時間:
2023-6-21 16:48
PID算法的靈魂在于如何找到P、I、D這三個參數的具體數值,至于軟件實現PID太簡單了,沒有分享的價值。
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
午夜久久久久久久久久一区二区
|
97人人超碰
|
亚洲免费网址
|
日韩欧美国产一区二区三区
|
国产资源视频
|
久久国产精品精品
|
午夜精品久久
|
久久蜜桃资源一区二区老牛
|
精品国产伦一区二区三区观看体验
|
九九亚洲精品
|
妞干网av
|
自拍偷拍精品
|
亚洲高清在线
|
国产精品免费观看
|
国产精品视频在线观看
|
亚洲成人精品一区二区
|
欧美xxxx色视频在线观看免费
|
99亚洲精品视频
|
a级大片免费观看
|
亚洲一区在线观看视频
|
国产黄色麻豆视频
|
日韩视频一区二区三区
|
欧美中文字幕在线观看
|
日韩欧美三区
|
成人免费视频播放
|
99精品观看
|
亚洲国产成人精品女人久久久野战
|
欧美福利
|
性高湖久久久久久久久aaaaa
|
久久亚洲欧美日韩精品专区
|
第一福利社区1024
|
我想看国产一级毛片
|
国产日韩精品久久
|
亚洲一区 中文字幕
|
91精品国产91久久久久久吃药
|
激情福利视频
|
色爽女
|
午夜精品视频在线观看
|
中文字幕日韩av
|
精精国产xxxx视频在线野外
|
在线视频一区二区三区
|