×
单片机 > 单片机程序设计 > 详情

单片机控制的步进电机PWM控制程序

发布时间:2020-05-29 发布时间:
|
8051单片机控制步进电机的C51语言编写的PWM控制程序

#include  
#include  
#include  
#include "UPSD3200.H" 
#include "upsd_pwm.h" 
#define uint unsigned int 
#define uchar unsigned char 
PSD_REGS PSD8xx_reg _at_ csiop; 
#define KEYIO (~(PSD8xx_reg.DATAIN_A)) & 0x07 
sbit CP=P4^7; 
sbit U_D=P1^1; 
void init_system(); // 系统初始化 
uchar keyboard(); 
void uPSD_PWM4_Variable(unsigned char PWM_Period, unsigned char PWM_PulseWidth); 
uchar Adjust_station=NO; 
unsigned char data x,flag; 
unsigned char keyboard() //键盘输入 

unsigned char a=0xff,b=0x01,c=0xf8,d;//有按键的位置 
uint i; 
do{ 
a=KEYIO|c; 
}while(a==0xff); 
if (a == 0xfe){d = '1';} 
else if (a == 0xfd){d = '2';} 
else if (a == 0xfb){d = '3';} 
else {d = '0';} 
return(d); 

void uPSD_PWM4_Init(void) 
unsigned int PWM_prescaler; 
P4SFS |= 0x80; 
PWM_prescaler = (unsigned int)((FREQ_OSC/2)/PWM4_INPUT_freq);//PWM4输入脉冲频率 K

PSCL1L = PWM_prescaler & 0x00ff; 
PSCL1H = (PWM_prescaler >> 8); 

void StepMotor_GO(bit direction,uint speed) { 
unsigned char PWM_Period, PWM_PulseWidth; 
uint temp_uint; 
U_D = direction;//方向 
temp_uint = (PWM4_INPUT_freq*1000)/speed; 
PWM_Period = (unsigned char)temp_uint; 
PWM_PulseWidth = PWM_Period/2; 
uPSD_PWM4_Variable(PWM_Period,PWM_PulseWidth); 

void StepMotor_STOP(void) 

P4SFS &= 0x7f; 

void uPSD_PWM4_Variable(unsigned char PWM_Period, unsigned char PWM_PulseWidth) 

P4SFS |= 0x80; 
PWMVP = PWM_Period; 
PWMVPW = PWM_PulseWidth; 
PWMCON |= 0x20; 

void initkey(void){ 
PSD8xx_reg.DATAOUT_A=0xFF; 
PSD8xx_reg.CONTROL_A=0x00; 
PSD8xx_reg.DIRECTION_A=0x00; 

void init_system() // 系统初始化 

WDKEY=0x55; 
P4SFS = (unsigned char) (0x08 << 3); 
uPSD_PWM_Channel_8bit(3,243); 
问题补充:(接着上面的序) 
void uPSD_PWM_Init_8bit(unsigned char PWM_channel_no, unsigned int PWM_freq8, unsigned char PWMCON_value) 

unsigned int PWM_prescaler; 
unsigned char output_polarity_mode; 
output_polarity_mode = PWMCON_value & 0x8F; 
PWMCON = (PWMCON & 0x70) | output_polarity_mode; 
P4SFS = (unsigned char) (0x08 << PWM_channel_no); 
PWM_prescaler = (unsigned int) ( (((unsigned int) FREQ_OSC) / 2) / PWM_freq8); 
PSCL0L = PWM_prescaler & 0x00ff; 
PSCL0H = (PWM_prescaler >> 8); 
PSCL1L = PWM_prescaler & 0x00ff; 
PSCL1H = (PWM_prescaler >> 8); 

void uPSD_PWM_Disable(void) 

PWMCON &= 0xDF; 

void main(void){ 
x=0; 
init_system(); 
flag=1; 
while(flag==1){ 
x=keyboard(); 
if(x=='1') {StepMotor_GO(0,100);} 
else if(x=='2') {StepMotor_GO(1,500);} 
else if(x=='3') { StepMotor_STOP();uPSD_PWM_Disable();} 
else if(x=='0') {uPSD_PWM_Disable();} 

}

关键字:单片机控制  步进电机  PWM控制

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址