亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
PWM控制電機(jī)轉(zhuǎn)速 為什么我的程序控制不了?
[打印本頁]
作者:
wsgy
時間:
2026-3-9 21:09
標(biāo)題:
PWM控制電機(jī)轉(zhuǎn)速 為什么我的程序控制不了?
#include <reg52.h>
sbit onn=P1^0;
sbit seet=P1^1;
sbit addd=P1^2;
sbit subb=P1^3;
sbit gass=P1^4;
sbit breakk=P1^5;
sbit IN1=P1^6;
sbit IN2=P1^7;
sbit ENA=P2^0;
//占空比,最大占空比
unsigned char ZKB,high=0,on=0,set=0,add=0,sub=0,sc=0,duty_zkb=0,ZKBB=0,cnt=0;
void Motor_Auto_add();
void Time0_Init(void);
void key_process(unsigned char key_num);
void key_scan();
void Time0_Init(void)
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=ET0=1;
TR0=1;
}
void main()
{ IN1=1;
IN2=0;
Motor_Auto_add();
Time0_Init();
//key_process(unsigned char key_num);
while(1)
{
key_scan();
}
}
//按鍵掃描
void key_scan()
{
int i=0;
//開始建,自增速
if(onn==0)
for(i=0;i<200;i++);
if(onn==0)
{
on=1;//開始標(biāo)志
while(onn==1);
}
if(seet==0)
for(i=0;i<200;i++);
if(seet==0)
{
set=1;//巡航開始標(biāo)志
duty_zkb=high;//將當(dāng)前占空比保留
while(seet==1);
}
if(addd==0)
for(i=0;i<200;i++);
if(addd==0)
{
add=1;//加速鍵標(biāo)志位
while(addd==1);
}
if(subb==0)
for(i=0;i<200;i++);
if(subb==0)
{
sub=1;//減速標(biāo)志位
while(subb==1);
}
}
//終端按鍵掃描執(zhí)行程序
void key_process(unsigned char key_num)
{
switch(key_num)
{
case 1:
high=0;
set=0;
break;
case 2:
high=0;
set=0;
break;
default:
break;
}
}
//電機(jī)調(diào)速
void Motor_Auto_add()
{
if(on==1)
{
high++;
high%=100;
}
//else
//{
//ZKB=0;
//}
if(set==1)
{
high=duty_zkb;
}
else if(set==0)
{high=0;}
if(set==1&&add==1)
{
high=high+1;
if(high==100)
add=0;
}
if(set==1&&sub==1)
{
high=high-1;
if(high<0)
sub=0;
}
}
//中斷優(yōu)先
void int0_srv() interrupt 0
{int i=0;
for(i=0;i<200;i++);
if(breakk==0)
{
key_process(1);
while(breakk==1);
}
else if(gass==0)
{
key_process(2);
while(gass==1);
}
}
void time0_srv() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cnt++;
cnt%=100;
if(cnt<high)
{
ENA=1;
}
else
{
ENA=0;
}
}
我想實現(xiàn)按鍵控制電機(jī)轉(zhuǎn)速,當(dāng)按鍵按下時可以保持當(dāng)前車速,再有按鍵按下時實現(xiàn)加速或者減速,為什么我的程序控制不了啊????
作者:
glinfei
時間:
2026-3-10 09:54
錯太多了,直說一個吧,將Motor_Auto_add()放入主循環(huán)中調(diào)用。另外,你調(diào)速邏輯不對,但好歹放進(jìn)去能略微抖動一下。
作者:
man1234567
時間:
2026-3-10 11:00
二樓言簡意該。可以AI找方案。
作者:
kk17328
時間:
2026-3-10 12:33
把程序copy給ai,然后提問,你會發(fā)現(xiàn)新大陸
作者:
wsgy
時間:
2026-3-11 15:46
參考各位的意見了,讓AI查問題改正后,還是無法實現(xiàn)速度保持。
PWM速度保持到底怎么實現(xiàn)啊?
這是改正后的程序
#include <reg52.h>
sbit onn=P1^0;
sbit seet=P1^1;
sbit addd=P1^2;
sbit subb=P1^3;
sbit gass=P1^4;
sbit breakk=P1^5;
sbit IN1=P1^6;
sbit IN2=P1^7;
sbit ENA=P2^0;
//占空比,最大占空比
unsigned char ZKB,on=0,set=0,add=0,sub=0,duty_zkb=0,cnt=0;
unsigned char high=0;
unsigned int j=0;
void Motor_Auto_add();
void Time0_Init(void);
void key_process(unsigned char key_num);
void key_scan();
void Int0_Init(void);
void Int0_Init(void)
{
IT0=1;//下降沿觸發(fā)
EX0=1;// 使能外部中斷0
EA=1;// 開總中斷
}
void Time0_Init(void)
{
TMOD=0X01;//定時器0工作模式1(16位定時器)
TH0=(65536-1000)/256;// 1ms定時初值(12MHz晶振)
TL0=(65536-1000)%256;
ET0=1; // 使能定時器0中斷
TR0=1;// 啟動定時器0
}
void main()
{ IN1=1;// 電機(jī)正轉(zhuǎn)方向
IN2=0;
Int0_Init();//初始化外部中斷0
Time0_Init();//初始化定時器0
while(1)
{
key_scan();
Motor_Auto_add();// 電機(jī)調(diào)速邏輯
}
}
//按鍵掃描
void key_scan()
{
unsigned int i=0;
//開始建,自增速
if(onn==0)
{
for(i=0;i<200;i++);
if(onn==0)
{
on=!on;//開始標(biāo)志
while(onn==0);
}
}
if(seet==0)
{
for(i=0;i<200;i++);
if(seet==0)
{
set=!set;//巡航開始標(biāo)志
if(set)
{duty_zkb=high;//將當(dāng)前占空比保留
}
while(seet==0);
}
}
if(addd==0)
{
for(i=0;i<200;i++);
if(addd==0)
{
add=1;//加速鍵標(biāo)志位
while(addd==0);
}
}
if(subb==0)
{for(i=0;i<200;i++);
if(subb==0)
{
sub=1;//減速標(biāo)志位
while(subb==0);
}
}
}
//終端按鍵掃描執(zhí)行程序
void key_process(unsigned char key_num)
{
switch(key_num) //電機(jī)停轉(zhuǎn)
{
case 1:
high=0;
duty_zkb=0;
set=0;
on=0;
IN1=1;
IN2=1;
break;
case 2:
on=1;
break;
default:
break;
}
}
//電機(jī)調(diào)速
void Motor_Auto_add()
{
if(on==1 && !set)
{
j++;
if(j>=50)//每50ms增加1%占空比
{
j=0;
if(high<100)
high++;
}
}
if(on==1 && set==1)
{
high=duty_zkb;
//巡航加速
if(add==1)
{
if(duty_zkb<100)
duty_zkb++;
add=0;//清除標(biāo)志位
}
if(sub==1)
{
if(duty_zkb>0)
duty_zkb--;
sub=0;
}
}
//未啟動,占空比清零
if(on==0)
{
high=0;
j=0;
}
}
//中斷優(yōu)先(剎車/油門)
void int0_srv() interrupt 0
{int i=0;
for(i=0;i<200;i++);
if(breakk==0)
{
key_process(1);
while(breakk==0);
}
else if(gass==0)
{
key_process(2);
while(gass==0);
}
}
//定時器中斷生成PWM
void time0_srv() interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
cnt++;
cnt%=100;
if(cnt<high)
{
ENA=1;
}
else
{
ENA=0;
}
}
作者:
a185980800
時間:
2026-3-11 20:47
我用AI幫你問了一下。#include <reg52.h> // 引腳定義 sbit onn = P1^0; // 啟動/停止 sbit seet = P1^1; // 巡航/保持 sbit addd = P1^2; // 加速 sbit subb = P1^3; // 減速 sbit gass = P1^4; // 油門(備用) sbit breakk = P1^5; // 緊急剎車 sbit IN1 = P1^6; // 電機(jī)方向1 sbit IN2 = P1^7; // 電機(jī)方向2 sbit ENA = P2^0; // PWM 輸出 // 全局變量 unsigned char high = 0; // 當(dāng)前占空比 (0-100) unsigned char duty_zkb = 0; // 巡航保存的基準(zhǔn)速度 bit on = 0; // 運行標(biāo)志 (1=運行, 0=停止) bit set = 0; // 巡航標(biāo)志 (1=巡航, 0=非巡航) bit add = 0; // 加速標(biāo)志 (1=等待處理) bit sub = 0; // 減速標(biāo)志 (1=等待處理) unsigned int j = 0; // 自動增速計時器 // 函數(shù)聲明 void Time0_Init(void); void key_scan(void); void Motor_Auto_add(void); void int0_srv(void) interrupt 0; void Time0_Init(void) { TMOD = 0x01; // 定時器0工作模式1 (16位定時器) TH0 = (65536 - 1000) / 256; // 1ms定時初值 (12MHz晶振) TL0 = (65536 - 1000) % 256; ET0 = 1; // 使能定時器0中斷 TR0 = 1; // 啟動定時器0 } void main() { IN1 = 1; // 電機(jī)正轉(zhuǎn) IN2 = 0; Time0_Init(); // 初始化定時器 while (1) { key_scan(); // 按鍵掃描 Motor_Auto_add(); // 電機(jī)調(diào)速 } } // 按鍵掃描 (帶消抖) void key_scan() { unsigned int i; // 啟動/停止鍵 (onn) if (onn == 0) { for (i = 0; i < 200; i++); // 消抖 if (onn == 0) { on = !on; // 切換運行狀態(tài) while (onn == 0); // 等待按鍵釋放 } } // 巡航鍵 (seet) if (seet == 0) { for (i = 0; i < 200; i++); if (seet == 0) { set = !set; // 切換巡航模式 if (set) duty_zkb = high; // 保存當(dāng)前速度 while (seet == 0); } } // 加速鍵 (addd) - 按下一次只觸發(fā)一次 if (addd == 0) { for (i = 0; i < 200; i++); if (addd == 0) { add = 1; // 標(biāo)記加速 while (addd == 0); } } // 減速鍵 (subb) - 按下一次只觸發(fā)一次 if (subb == 0) { for (i = 0; i < 200; i++); if (subb == 0) { sub = 1; // 標(biāo)記減速 while (subb == 0); } } } // 電機(jī)調(diào)速核心邏輯 (關(guān)鍵修正) void Motor_Auto_add() { // 巡航模式下:先處理加速/減速,再更新速度 if (set) { // 1. 處理加速 (修改基準(zhǔn)速度) if (add) { if (duty_zkb < 100) duty_zkb++; add = 0; // 立即清零標(biāo)志位 } // 2. 處理減速 (修改基準(zhǔn)速度) if (sub) { if (duty_zkb > 0) duty_zkb--; sub = 0; // 立即清零標(biāo)志位 } // 3. 將當(dāng)前速度更新為最新基準(zhǔn) high = duty_zkb; } // 非巡航模式:速度由按鍵控制 (無自動增速) else { if (on) { // 速度保持為0,直到按下加速鍵 // (原自動增速邏輯已移除,避免失控) } else { high = 0; // 未運行時速度清零 } } } // 外部中斷0 (緊急剎車/油門) void int0_srv() interrupt 0 { if (breakk == 0) { // 緊急剎車 on = 0; set = 0; high = 0; duty_zkb = 0; while (breakk == 0); // 等待釋放 } else if (gass == 0) { // 油門啟動 on = 1; while (gass == 0); } } // 定時器0中斷 (PWM生成) void time0_srv() interrupt 1 { TH0 = (65536 - 1000) / 256; // 1ms定時 TL0 = (65536 - 1000) % 256; static unsigned char cnt = 0; cnt++; if (cnt >= 100) cnt = 0; // 100ms周期 (100Hz PWM) if (cnt < high) { ENA = 1; // 占空比內(nèi)輸出高 } else { ENA = 0; // 占空比外輸出低 } }
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1