
上桥臂PWM输出,下桥臂常闭。你要是做电机的话这个就会好理解了。
用库函数不是有个TIM_CCxN配置的函数。给TIM_CCx配置一个CCR的值。把互补通道这个关掉就好了。
脉冲宽度调制(PWM),是对脉冲宽度的控制。
STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出!
本实验是利用 TIM3 的通道 2,把通道 2 重映射到 PB5, 产生 PWM 来控制 DS0 的亮度。
TIM3_CH2 默认是接在 PA7上面的,而我们的 DS0 接在 PB5 上面,可以通过重映射功能,把 TIM3_CH2映射到 PB5 上。
你那个地方不明白?能具体说说吗?我看程序已经有不少注释了啊?
下面的比较多,复杂些,先简单的说下吧:
一、加速减速,就是增加或减少脉冲宽度,改变电机速度!脉冲的宽度由
1、CLK=0的状态持续,由T1的定时决定;
2、CLK=1的状态持续,由(T0-T1)的时间决定;
二、定时器中断TH0=0x00 ; TL0=0x00 ;
1、T0定时器工作1方式,T0定时器启动后,从TH0、TL0赋值的计数值开始增加,增加到0XFFFF后,T0中断!
2、T0溢出后(中断),T0计数器不会自动停止,所以需要重新给T0定时器赋值!赋值后,进入下一个计数周期!
3、例子中,T0定时器从0x0000开始计数,也就是增加0xFFFF后进行中断!定时时间为 (0xFFFF / ( 晶振周期/12 ))) 秒,若晶振为12M,则定时为,65536ms!
分析程序,从main开始分析,先将起始开始的时序图画出:
如下图!
从时序图可以看出,CLK为PWM输出,
1、CLK=0的状态持续,由T1的定时决定;
2、CLK=1的状态持续,由T0-T1的时间决定;
而 main 函数中的 while(1) 部分,进行的就是PWM调整程序。
1、 if (K3==0) //高电平逆时钟转,低电平顺时钟转
{
ZF=0;
}
else
{
ZF=1;
}
根据程序推测,程序若为电机控制,K3开关为0时,ZF=0,顺时针转,K3开关为1时,ZF=1,逆时针转。
2、
if(K1==0) //按下加速键
{
delay(1);
PWML++; //调宽值低四位加1
if(PWML==0x00)
{
PWMH++;
} //调宽值高四位加1
if (PWMH==0xFF) //最大值时
{
PWMH=0xFE;
}
}
K1按键,加速按键,增加T1定时器计数起始时间,也就是减少T1计数时间,减少CLK=0的时间。
3、
if(K2==0) //按下减速键
{
delay(1);
PWML-- ; //调宽值低四位减1
if (PWML==0x00)
{
PWMH--;
} //调宽值高四位减1
if (PWMH==0x00)
{
PWMH=0x01;
} //最小值时
}
K2按键,减速按键,降低T1定时器计数起始时间,也就是增加T1计数时间,增加CLK=0的时间。
4、不论加速、减速,T0的时间都不变,CLK=0和CLK=1总持续时间不变{ (Tclk0+Tclk1)=T0 }。
程序不难,图不好画啊!
#include <intrinsh>
#include <stdioh>
#include <mathh>
#include "UPSD3200H"
#include "upsd_pwmh"
#define uint unsigned int
#define uchar unsigned char
PSD_REGS PSD8xx_reg _at_ csiop;
#define KEYIO (~(PSD8xx_regDATAIN_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_freq1000)/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_regDATAOUT_A=0xFF;
PSD8xx_regCONTROL_A=0x00;
PSD8xx_regDIRECTION_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();}
}
}
你是要控制SG3252的PWM输出就是了。
那要看你的3525是多大电压供电的。
如果3525和430供电压相等,那么,就直接把430输出的PWM连接到3525的第10脚上,如果3525的供电电压比430供电电压高,那么,可以通过光耦隔离或者用三极管也行,去驱动第10脚
以上就是关于STM32F103配置一个PWM输出的程序是什么全部的内容,包括:STM32F103配置一个PWM输出的程序是什么、帮我解释一下这个PWM控制电机调速的程序。、PWM程序~~~~~急急急!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)