STM32F103配置一个PWM输出的程序是什么

STM32F103配置一个PWM输出的程序是什么,第1张

上桥臂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程序~~~~~急急急!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10139829.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存