基于STM32的SPWM源代码.doc_第1页
基于STM32的SPWM源代码.doc_第2页
基于STM32的SPWM源代码.doc_第3页
基于STM32的SPWM源代码.doc_第4页
全文预览已结束

下载本文档

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

文档简介

1、TIMER输出PWM基本概念脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。一般用来控制步进电机的速度等等。STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。1.1 PWM输出模式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.9 PWM模式”一节,在此就不详细赘述了。1.2 PWM输出管脚PWM的输出管脚是确定好的,具体的引脚功能可以查看STM32参考手册的“8.3.7 定时器复用功能重映射”一节。在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。但是这些重映像的管脚也是由参考手册给出的。比如说TIM3的第2个通道,在没有重映像的时候,指定的管脚是PA.7,如果设置部分重映像之后,TIM3_CH2的输出就被映射到PB.5上了,如果设置了完全重映像的话,TIM3_CH2的输出就被映射到PC.7上了。1.3 PWM输出信号PWM输出的是一个方波信号,信号的频率是由TIMx的时钟频率和TIMx_ARR预分频器所决定的,具体设置方法在前面一个学习笔记中有详细的交代。而输出信号的占空比则是由TIMx_CRRx寄存器确定的。其公式为“占空比=(TIMx_CRRx/TIMx_ARR)*100%”,因此,可以通过向CRR中填入适当的数来输出自己所需的频率和占空比的方波信号。2、TIMER输出PWM源代码#include stm32f10x.h/* Private typedef -*/GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;TIM_BDTRInitTypeDef TIM_BDTRInitStructure;NVIC_InitTypeDef NVIC_InitStructure;/* Private define -*/* Private macro -*/* Private variables -*/u16 TimerPeriod = 7200;u16 DutyFactor = 50;/* Private function prototypes -*/* Private functions -*/void RCC_Configure();void GPIO_Configure();void TIM_Configure();void PWM_Configure();void NVIC_Configure();/* * brief Main program. * param None * retval None */void RCC_Configure() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 | RCC_APB1Periph_TIM3,ENABLE); void GPIO_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, &GPIO_InitStructure);void TIM_Configure() /* Time Base configuration 这里配置的就是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_TimeBaseStructure); 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_TimeBaseStructure); TIM_ClearFlag(TIM4, TIM_FLAG_Update); /清除溢出中断标志 TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); / 计数溢出时触发中断 void PWM_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_OCInitStructure); TIM_OC2Init(TIM3, &TIM_OCInitStructure); /初始化两组互补的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_BDTRInitStructure); TIM_CtrlPWMOutputs(TIM3, ENABLE); /* 主输出启用 */void NVIC_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(&NVIC_InitStructure);int main(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里执行void TIM4_IRQHandler(void) static vu16 sign = 0; static vu16 Counter_sine=0; static vu16 Duty_Cycle_sinewavetable128=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; if ( TIM_GetITStatus(TIM4 , TIM_IT_Update) = SET) if(sign = 0) TIM_SetCompare1(TIM3,Duty_Cycle_sinewavetableCounter_sine); TIM_SetC

温馨提示

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

评论

0/150

提交评论