❶ 用51单片机用PWM调速C语言程序怎么写·····
含糊其辞,不明不白。
其实,出题人也不想,要答案。
❷ 如何用51单片机给电机调速
就是利用单片机的PWM就可以了(脉冲调制)
PWM信号到马达驱动芯片即可,小电机就一个三极管都可以。
❸ 51单片机怎么产生pwm程序
正则表达式替换 import java.util.regex.Matcher; import java.util.regex.Pattern; public class $ { public static void main(String... _) { String sa = "<ABCDEFGHIJK>SDFER<EGD>FG"; Pattern p = Pattern.compile("<([A-Z]|[a-z]){0,}>"); Matcher match = p.matcher(sa); while (match.find()) { String str = match.group(); sa = sa.replaceFirst(str, str.toLowerCase()); } System.out.println(sa); } }
❹ 51单片机产生频率为1KHZ,占空比可调的PWM汇编程序,初学者,求完整程序
#include<reg51.h>
sbitP_OUT=P3^7;
sbitUP=P1^0;
sbitDN=P1^1;
unsignedcharp=5,n;
voidT0_INT()interrupt1
{
n++;
if(n>9)n=0;//0~9
if(n<=p)P_OUT=1;
elseP_OUT=0;
}
main()
{
TMOD=0x02;
TH0=156;
TR0=1;
IE=0x82;
while(1){
if(P<9&&!UP){while(!UP);p++;}
if(p>0&&!DN){while(!DN);p--;}
}
}
你编译一下,汇编程序,就出来了。
❺ 51单片机直流电机调速
第一:你这个不是电机调速的,用外部中断是测速的呀。
下面是我写的.PID部分的代码就不给了,想加的话,自己找可以了
#include <AT89X52.H>
#include "common.h"
#define _WHEEL_C_
#define Left_moto_pwm P1_5
#define Right_moto_pwm P1_4
#define Left_moto_go {IN1=0,IN2=1;}
#define Left_moto_back {IN1=1,IN2=0;}
#define Right_moto_go {IN3=1,IN4=0;}
#define Right_moto_back {IN3=0,IN4=1;}
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
unsigned char pwm_val_left=0;
unsigned char push_val_left=0;
unsigned char pwm_val_right=0;
unsigned char push_val_right=0;
float L_Count=0,R_Count=0;
unsigned int TimerNum=0,SYS_TimeNum=0;
float Save_L_Distance=0,Save_R_Distance=0,Left_Speed=0,Right_Speed=0;
unsigned char Left_point=0,Right_point=0;
unsigned char sys_1ms=0,sys_1s=0,TurnFlag=0;
//初始化PWM调速函数
void Init_Wheel()
{
TMOD = 0x01;
TH0 = 0x0FF;
TL0 = 0x0A4;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Init_WheelSpeedInter()
{
IT0=1; //INT0下降沿中断
EX0=1; //允许INT1中断
IT1=1; //INT1下降沿中断
EX1=1; //允许INT1中断
EA=1;
}
//得到上一次0.5秒的行驶距离
float GetLeftWheelMileage()
{
return Save_L_Distance;
}
//得到上一次0.25秒的行驶距离
float GetRightWheelMileage()
{
return Save_R_Distance;
}
void Inter_Left(void) interrupt 0
{
L_Count++;
}
void Inter_Right(void) interrupt 2
{
R_Count++;
}
//小车向前函数
void Wheel_Run(char left_val,char right_val)
{
push_val_left=left_val;
push_val_right=right_val;
Left_moto_go ;
Right_moto_go ;
}
//小车后退函数
void Wheel_Back(char left_val,char right_val)
{
push_val_left=left_val;
push_val_right=right_val;
Left_moto_back;
Right_moto_back;
}
//小车停止函数
void Wheel_Stop(void)
{
Wheel_Run(0,0);
}
//左轮PWM调速函数
void pwm_out_left_moto(void)
{
if(pwm_val_left>200)
{
pwm_val_left=0;
}else
{
if(pwm_val_left<=push_val_left)
{
Left_moto_pwm=1;
}
else
{
Left_moto_pwm=0;
}
}
}
//右轮调速函数
void pwm_out_right_moto(void)
{
if(pwm_val_right>200)
{
pwm_val_right=0;
}else
{
if(pwm_val_right<=push_val_right)
{
Right_moto_pwm=1;
}
else
Right_moto_pwm=0;
}
}
//PWM调速中断(TIMER0--工作方式1)
void Wheel_Interrupt(void) interrupt 1
{
TH0 = 0x0FF;
TL0 = 0x0A4;
TimerNum++;
if(TimerNum>=2500)
{
//左右轮速度cm/s
Left_Speed=4*L_Count;
Right_Speed=4*R_Count;
//左右轮0.25秒行驶距离
Save_L_Distance+=L_Count;
Save_R_Distance+=R_Count;
//数据发送到串口图示
DataScope_Get_Channel_Data(L_Count, 1 ); //将数据 1.0 写入通道 1
DataScope_Get_Channel_Data(R_Count, 2 ); //将数据 2.0 写入通道 2
Send_Count = DataScope_Data_Generate(2); //生成10个通道的 格式化帧数据,返回帧数据长度
for( DateNum = 0 ; DateNum < Send_Count; DateNum++) //循环发送,直到发送完毕
{
SendByte(DataScope_OutPut_Buffer[DateNum]);
}
TimerNum=0;
L_Count=0;
R_Count=0;
}
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}