找回密码
 注册
关于网站域名变更的通知

STM32一个PWM程序

2023-1-5 13:31| 查看: 87| 评论: 0

摘要: 这是main.c主程序
这是main.c  主程序4 H/ A$ q& @8 R! k

: U. R. A- n9 I
//这是STM32F103ZE的一个模板
//在PA8 PB13 产生一个互补的PWM波,频率为10KHz,占空比为1/5) Q* ^" f9 _5 I1 A
#include "stm32f10x.h"1 X- Z4 }1 j" h" l. y
BitAction bbt=0; //定义一个位变量 bbt,并清0
u16 i;
int main(void)
{" B5 @& U4 [7 n$ K7 n; x: N
u16 InitValue,Pre_Divide,ZKB;" }$ h" M  x3 d
SystemInit(); //系统时钟初始化,调用该函数后,系统时钟为72M,函数原形在system_stm32f10x.c中
GPIO_init();. |+ F, A: j" ]- ?6 L4 y+ ?3 }
//****TIM1_PWM波1通道设置****************************************************************; X& g& ]0 M. S0 j5 A) b( l( @
InitValue=7200;               //初值1000' B9 m7 c5 U! ~; \
Pre_Divide=1;                       //预分频1' l. s5 r7 _/ r
ZKB=1200;                                   //占空比
TIM1_PWM_1_init(InitValue,Pre_Divide,ZKB);( V. j7 m+ B* F
) ?  j; F: L1 E  d( M" e; U. h! R
//TIM1->CCR1=2400;      //修改占空比$ {' @* N$ H8 N2 @# N* ]+ w- }
//**************************************************************************************% `, j% {: _8 g2 I/ H7 D- w  }( K
. e* l: K/ U& A% ]
while(1)
{
           //. y; u7 ^7 ~; M& X. F# `, X% F+ [
}8 X: P4 F$ d, z) H; `8 [

}
4 v* o1 J; c9 N

这是sysinit.c  系统程序- G2 `# O2 X9 }( [' o0 S6 c

& Y2 m! ?8 G3 C! ^5 J4 p- m

#include "stm32f10x.h"% C. n' U# K& x- x6 x2 f
  E6 q- Y4 G# _& W$ N
void GPIO_init()
{
GPIO_InitTypeDef GPIO_InitStructure; //声明端口结构,需要放在前面
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);                                                      
                                                                      //开启相应端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);" n6 _" N- l) E/ \* k$ [) m/ ?' S8 x% ^
//***************端口A8,A9,A10是TIM1_PWM波的输出端***************************$ U& Q6 H: _, N4 m9 v: V' s4 O
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //PWM波设为复用推挽输出% ~% j* y; ?$ T
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //端口频率可设为2,10,50% R8 C& [, C% H8 a
GPIO_Init(GPIOA, &GPIO_InitStructure);                        //启动A端口
//***************************************************************************! S! I! G  s. J7 R
//**************端口B13,B14,B15是TIM1_PWM波的互补输出端**********************+ X/ H% p7 K+ D# a) x+ z
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;- E& Q) s4 h+ G
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;     //端口频率可设为2,10,50
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;       //PWM波的复用推挽输出: g. C" u2 ]  e
GPIO_Init(GPIOB,&GPIO_InitStructure);                   //启动B端口
//***************************************************************************
}7 L0 P* ^& q5 E/ {
//****TIM1_PWM波1通道初始化**********************************************************************1 \0 N5 h# c6 w8 R1 F
void TIM1_PWM_1_init(u16 InitValue, u16 Pre_Divide, u16 CCR1_Val)
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef        TIM_OCInitStructure;
TIM_BDTRInitTypeDef      TIM_BDTRInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);* H; m& [2 c; v
TIM_TimeBaseStructure.TIM_Period =InitValue;& X- a( r' x9 M  Y+ r/ ^8 a
TIM_TimeBaseStructure.TIM_Prescaler =Pre_Divide-1;/ L- j" u2 J3 b+ i: n
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);1 t1 H; B1 q- n# u. V+ |( e  S
TIM_ARRPreloadConfig(TIM1,ENABLE);                             //使能TIM1在ARR上的预装载寄存器# f# r/ X) {5 }4 D0 b
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//   选择定时器模式        TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;            //选择输出比较状态" P+ Q7 i3 s+ q. M( s9 x3 J
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;    //选择互补输出比较状态1 V) ^6 D7 L# X& R
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;             //选择输出极性
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;       //选择互补输出极性
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;                  //设置待装入捕获比较寄存器的脉冲值
TIM_OC1Init(TIM1, &TIM_OCInitStructure);//捕获比较匹配器结构1通道赋值
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);       //使能TIM1在CCR1上的预装载寄存器
//死区设置
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;//TIM1_OSSRState设置在运行模式下非工作状态选项
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;//TIM1_OSSIState设置在空闲模式下非工作状态选项(使能TIM1 OSSI状态)& C+ Y8 z4 L* G( ?' Z$ A9 T  D  b
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //TIM1_LOCKLevel设置了锁电平参数(不锁任何位)
TIM_BDTRInitStructure.TIM_DeadTime = 0x90;     //这里调整死区大小0-0xff,TIM1_DeadTIM1指定了输出打开和关闭状态之间的延时
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; //TIM1_Break使能或者失能TIM1刹车输入(失能TIM1刹车输入)# k1 t9 d9 [# r% a2 m- z* Z
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;//TIM1_BreakPolarity设置TIM1刹车输入管脚极性(TIM1刹车输入管脚极性高): ^1 T. m) z8 u$ j
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;//TIM1_AutomaticOutput使能或者失能自动输出功能(自动输出功能使能)
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);//(设置刹车特性,死区时间,锁电平,OSSI,OSSR状态和AOE(自动输出使能))
TIM_Cmd(TIM1, ENABLE);                                 //使能或者失能指定的TIM1! w! m; V6 ^' A5 N: y4 @9 T' C# `, h
TIM_CtrlPWMOutputs(TIM1, ENABLE);                          //使能或者失能TIM1外设的主输出
}
本站资讯文章系编辑转载,转载目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!
[声明]本站文章版权归原作者所有 内容为作者个人观点 本站只提供参考并不构成任何投资及应用建议。
本站拥有对此声明的最终解释权。
收藏 邀请
关闭

推荐内容上一条 /1 下一条

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-9-22 19:14 , Processed in 0.125000 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

返回顶部