基于STM32的SPWM源代码_第1页
基于STM32的SPWM源代码_第2页
基于STM32的SPWM源代码_第3页
基于STM32的SPWM源代码_第4页
基于STM32的SPWM源代码_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——基于STM32的SPWM源代码1、TIMER输出PWM基本概念

脉冲宽度调制(PWM),是英文“PulseWidthModulation〞的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种十分有效的技术。简单一点,就是对脉冲宽度的控制。一般用来控制步进电机的速度等等。STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。1.1PWM输出模式

STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄放器中的OCxM位确定的(“110〞为模式1,“111〞为模式2)。模式1和模式2的区别如下:110:PWM模式1-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。由此看来,模式1和模式2正好互补,互为相反,所以在运用起来区别也并不太大。而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9PWM模式〞一节,在此就不详细赘述了。1.2PWM输出管脚

PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7定时器复用功能重映射〞一节。在此需要强调的是,不同的TIMx有分派不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄放器,来使得在其他非原始指定的管脚上也能输出PWM。但是这些重映像的管脚也是由参考手册给出的。譬如说TIM3的第2个通道,在没有重映像的时候,指定的管脚是PA.7,假使设置部分重映像之后,TIM3_CH2的输出就被映射到PB.5上了,假使设置了完全重映像的话,TIM3_CH2的输出就被映射到PC.7上了。1.3PWM输出信号

PWM输出的是一个方波信号,信号的频率是由TIMx的时钟频率和TIMx_ARR预分频器所决定的,具体设置方法在前面一个学习笔记中有详细的交代。而输出信号的占空比则是由TIMx_CRRx寄放器确定的。其公式为“占空比=(TIMx_CRRx/TIMx_ARR)*100%〞,因此,可以通过向CRR中填入适当的数来输出自己所需的频率和占空比的方波信号。

2、TIMER输出PWM源代码

#include\

/*Privatetypedef*/GPIO_InitTypeDefGPIO_InitStructure;

TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_OCInitTypeDefTIM_OCInitStructure;

TIM_BDTRInitTypeDefTIM_BDTRInitStructure;NVIC_InitTypeDefNVIC_InitStructure;

/*Privatedefine*//*Privatemacro*//*Privatevariables*/u16TimerPeriod=7200;u16DutyFactor=50;

/*Privatefunctionprototypes*//*Privatefunctions*/voidRCC_Configure();voidGPIO_Configure();voidTIM_Configure();voidPWM_Configure();voidNVIC_Configure();/**

*@briefMainprogram.*@paramNone*@retvalNone*/

voidRCC_Configure(){

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM3,ENABLE);}

voidGPIO_Configure(){

/*GPIOA配置:通道PA.6和PA.7为输出引脚*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,}

voidTIM_Configure(){

/*TimeBaseconfiguration这里配置的就是PWM的周期,pwm还真是比AVR的强劲*/TIM_TimeBaseStructure.TIM_Prescaler=0;

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数方式

TIM_TimeBaseStructure.TIM_Period=TimerPeriod-1;TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStructure.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM3,

TIM_DeInit(TIM4);//这边是普通定时器的初始化和中断申请TIM_TimeBaseStructure.TIM_Period=1;//自动重装载寄放器的值TIM_TimeBaseStructure.TIM_Prescaler=3599;//时钟预分频数

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//采样分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数方式TIM_TimeBaseInit(TIM4,

TIM_ClearFlag(TIM4,TIM_FLAG_Update);//清除溢出中断标志

TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//计数溢出时触发中断}

voidPWM_Configure(){

/*通道1,2和3配置在PWM模式*/

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;TIM_OCInitStructure.TIM_Pulse=DutyFactor*7200/100;//设置占空比

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//这里的4行代码就是设置PWM的空闲电平、波形方式的!一开始自己一不防备搞成了都高的死区,这里是都低电平的死区~TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCIdleState_Reset;TIM_OC1Init(TIM3,

TIM_OC2Init(TIM3,//初始化两组互补的PWM

/*自动输出访能,中断,死区相关的设置*/

TIM_BDTRInitStructure.TIM_OSSRState=TIM_OSSRState_Enable;TIM_BDTRInitStructure.TIM_OSSIState=TIM_OSSIState_Enable;TIM_BDTRInitStructure.TIM_LOCKLevel=TIM_LOCKLevel_1;

TIM_BDTRInitStructure.TIM_DeadTime=12;//死区时间为12/SYSTEMCLK(ns)TIM_BDTRInitStructure.TIM_Break=TIM_Break_Disable;//关闭外部break功能,当然在产品中最好参与这个保护,蛮好用的。

TIM_BDTRInitStructure.TIM_BreakPolarity=TIM_BreakPolarity_High;

TIM_BDTRInitStructure.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;TIM_BDTRConfig(TIM3,

TIM_CtrlPWMOutputs(TIM3,ENABLE);/*主输出启用*/}

voidNVIC_Configure(){

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;//通道TIM3

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//副优先级NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(}

intmain(void){

RCC_Configure();GPIO_Configure();TIM_Configure();PWM_Configure();

NVIC_Configure();

TIM_Cmd(TIM3,ENABLE);/*TIM3的计数器使能*/TIM_Cmd(TIM4,ENABLE);/*TIM4的计数器使能*/while(1);}

放在system32_it.c里执行

voidTIM4_IRQHandler(void){

staticvu16sign=0;

staticvu16Counter_sine=0;staticvu16Duty_Cycle_sinewavetable[128]={0x0,0x83,0x105,0x187,0x209,0x28A,0x30A,0x38A,0x409,0x486,0x502,0x57D,0x5F7,0x66F,0x6E5,0x75A,0x7CC,0x83D,0x8AB,0x917,0x981,0x9E8,0xA4D,0xAAF,0xB0E,0xB6B,0xBC4,0xC1B,0xC6E,0xCBE,0xD0B,0xD54,0xD9A,0xDDD,0xE1C,0xE57,0xE8F,0xEC3,0xEF3,0xF1F,0xF48,0xF6C,0xF8D,0xFA9,0xFC2,0xFD6,0xFE6,0xFF3,0xFFB,0xFFF,0xFFF,0xFFB,0xFF3,0xFE6,0xFD6,0xFC2,0xFA9,0xF8D,0xF6C,0xF48,0xF1F,0xEF3,0xEC3,0xE8F,0xE57,0xE1C,0xDDD,0xD9A,0xD54,0xD0B,0xCBE,0xC6E,0xC1B,0xBC4,0xB6B,0xB0E,0xAAF,0xA4D,0x9E8,0x981,0x917,0x8AB,0x83D,0x7CC,0x75A,0x6E5,0x66F,0x5F7,0x57D,0x502,0x486,0x409,0x38A,0x30A,0x28A,0x209,0x187,0x105,0x83,0x0}

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论