標(biāo)題:
單片機(jī)接收PWM顯示轉(zhuǎn)速問(wèn)題
[打印本頁(yè)]
作者:
時(shí)間煮雨我煮魚(yú)
時(shí)間:
2023-7-30 15:12
標(biāo)題:
單片機(jī)接收PWM顯示轉(zhuǎn)速問(wèn)題
下面有兩塊板,綠色的數(shù)碼管是顯示轉(zhuǎn)速的,紅色的數(shù)碼管是顯示clock信號(hào)的,也就是顯示頻率的,比如當(dāng)紅色的數(shù)碼管手動(dòng)調(diào)到200Hz時(shí),綠色數(shù)碼管就要顯示800轉(zhuǎn)速,這是個(gè)假設(shè),不一定只顯示800轉(zhuǎn),看電機(jī)是幾對(duì)極來(lái)計(jì)算,現(xiàn)在綠色數(shù)碼管的板子上引了一根通訊線與紅色數(shù)碼管的PWM線相連,打算用這根線來(lái)接收紅色數(shù)碼管通訊線的脈沖,然后將他轉(zhuǎn)換得到轉(zhuǎn)速顯示在綠色數(shù)碼管上,目前我需要知道一個(gè)思路,因?yàn)槲覍?xiě)出來(lái)的沒(méi)有實(shí)現(xiàn)出來(lái),請(qǐng)大伙給個(gè)思路或函數(shù)框架。
51hei圖片_20230730151138.jpg
(2.97 MB, 下載次數(shù): 71)
下載附件
2023-7-30 15:11 上傳
作者:
wulin
時(shí)間:
2023-7-30 21:56
適用于1000轉(zhuǎn)/分鐘以內(nèi)
#include <reg51.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define DASE 60000
//全局變量聲明
// 數(shù)據(jù)頭 方向位 高位 低位 驗(yàn)證 數(shù)據(jù)尾
uchar data dis_buf[6]={ 0xaa, 0x00, 0x00, 0x00, 0xff, 0x55 };
uint D_num; //定時(shí)器中斷計(jì)數(shù)變量
uint speed=0; //轉(zhuǎn)速
uint temp=0; //T0中斷計(jì)數(shù)臨時(shí)變量
uint count=0; //主循環(huán)計(jì)數(shù)變量
uchar flag_Z=0; //外部中斷標(biāo)志
bit flag_D=0; //T0中斷標(biāo)志
//---本地函數(shù)聲明---//
void Timer0Init(); //定時(shí)器T0初始化
void UartInit(); //定時(shí)器T1初始化波特率
void Delay_ms(uint t); //延時(shí)函數(shù)
//主函數(shù)
void main()
{
uchar k;
Timer0Init(); //初始化定時(shí)器0
UartInit(); //初始化定時(shí)器1波特率發(fā)生器
Delay_ms(100); //長(zhǎng)延時(shí)100ms
IE0 = 0; //INT0中斷請(qǐng)求標(biāo)志清0
IT0 = 1; //設(shè)置外部下降沿中斷
EX0 = 1; //開(kāi)INT0中斷
ET0 = 1; //開(kāi)T0中斷
EA = 1; //開(kāi)總中斷
Delay_ms(100); //長(zhǎng)延時(shí)100ms
flag_Z=0; //外部中斷標(biāo)志初始0,消除加電時(shí)外部中斷的一次觸發(fā)
while(1)
{
if(flag_D==1) //定時(shí)器中斷250ms
{
flag_D=0; //定時(shí)器中斷標(biāo)志清0
count++; //250ms計(jì)數(shù)++
if(flag_Z==3) //外部中斷標(biāo)志
{
flag_Z=2; //外部中斷標(biāo)志復(fù)位
speed=DASE/D_num; //計(jì)算轉(zhuǎn)速 r/min
dis_buf[2]=speed>>8; //轉(zhuǎn)速高8位
dis_buf[3]=speed; //轉(zhuǎn)速低8位
count=0; //250ms計(jì)數(shù)清0
}
else if(count>24) //否則 如果持續(xù)6秒收不到外部中斷信號(hào)清一次所有信息
{
count=0;
speed=0; //轉(zhuǎn)速清0
dis_buf[2]=0x00; //轉(zhuǎn)速高位緩存清0
dis_buf[3]=0x00; //轉(zhuǎn)速低位緩存清0
D_num=0; //定時(shí)器中斷緩存清0
temp=0; //定時(shí)器中斷變量清0
flag_Z=0; //外部中斷標(biāo)志清0
}
dis_buf[4]=dis_buf[0]+dis_buf[1]+dis_buf[2]+dis_buf[3]+dis_buf[5];//計(jì)算驗(yàn)證碼
for(k=0;k<6;k++)
{
SBUF = dis_buf[k]; //串口發(fā)送數(shù)據(jù)串
while(!TI); //等待串口發(fā)送中斷請(qǐng)求標(biāo)志位為1
TI=0; //串口發(fā)送中斷請(qǐng)求標(biāo)志清0
}
}
}
}
//T0中斷服務(wù)函數(shù) 周期1ms
void Timer0Interrupt() interrupt 1
{
static uint i;
temp++;
i++;
if(i>=250) //250ms
{
i=0;
flag_D=1; //T0中斷標(biāo)志
}
}
//INT0中斷服務(wù)函數(shù)
void INT0_Isr() interrupt 0
{
TR0=0; //關(guān)定時(shí)器0
D_num=temp; //讀取定時(shí)器1ms中斷計(jì)數(shù)值
temp=0; //定時(shí)器1ms中斷計(jì)數(shù)值清0
TL0 = 0x66; //設(shè)置定時(shí)初始值
TH0 = 0xfc; //設(shè)置定時(shí)初始值
TR0=1; //開(kāi)定時(shí)器0
if(++flag_Z>=3) //判斷外部(霍爾)中斷,用于起步消除錯(cuò)誤計(jì)數(shù)
flag_Z=3;
}
//延時(shí)函數(shù)
void Delay_ms(uint t) //@11.0592MHz
{
uint i,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}
//初始化定時(shí)器T0
void Timer0Init() //1毫秒@11.0592MHz
{
TMOD|= 0x01; //設(shè)置定時(shí)器16位自動(dòng)重載模式
TL0 = 0x66; //設(shè)置定時(shí)初始值
TH0 = 0xfc; //設(shè)置定時(shí)初始值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
}
//初始化串口T1
void UartInit() //9600bps@11.0592MHz
{
SCON = 0x50; //8位數(shù)據(jù),可變波特率
TMOD|= 0x20; //設(shè)置定時(shí)器模式
TL1 = 0xfd; //設(shè)置定時(shí)初始值
TH1 = 0xfd; //設(shè)置定時(shí)初始值
ET1 = 0; //禁止定時(shí)器中斷
TR1 = 1; //定時(shí)器1開(kāi)始計(jì)時(shí)
}
復(fù)制代碼
作者:
zsyzdx
時(shí)間:
2023-7-31 09:20
你需要把控制電機(jī)的PWM信號(hào)變成頻率信號(hào)調(diào)節(jié)電機(jī)的速度 頻率是不變的,所以你目前應(yīng)該不行,要么用程序,采集占空比輸出頻率也可以!要么就直接用單片機(jī)驅(qū)動(dòng)兩個(gè)數(shù)碼管顯示,然后單片機(jī)輸出PWM控制最簡(jiǎn)單。
作者:
yzwzfyz
時(shí)間:
2023-7-31 16:20
這是硬件問(wèn)題。需要一個(gè)PWM電壓與轉(zhuǎn)速的對(duì)應(yīng)關(guān)系。這個(gè)關(guān)系與硬件相關(guān),你能找出這個(gè)關(guān)系嗎。
認(rèn)真讀相關(guān)硬件的手冊(cè)吧。尤其是電機(jī)。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1