原创 STM32笔记(二)TIM模块产生PWM

2008-12-13 15:38 13688 8 10 分类: MCU/ 嵌入式
     这个是STM32的PWM输出模式,STM32的TIM1模块是增强型的定时器模块,天生就是为电机控制而生,可以产生3组6路PWM,同时每组2路PWM为互补,并可以带有死区,可以用来驱动H桥。
  下面的代码,是利用TIM1模块的1、2通道产生一共4路PWM的代码例子,类似代码也可以参考ST的固件库中相应example
    
//Step1.开启TIM和相应端口时钟
//启动GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \
                       RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\
                       ENABLE);
//启动AFIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//启动TIM1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

//Step2. GPIO做相应设置,为AF输出
//PA.8/9口设置为TIM1的OC1输出口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

//PB.13/14口设置为TIM1_CH1N和TIM1_CH2N输出口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

//Step3. TIM模块初始化
void TIM_Configuration(void)
{
    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

    //TIM1基本计数器设置(设置PWM频率)
    //频率=TIM1_CLK/(ARR+1)
    TIM_BaseInitStructure.TIM_Period = 1000-1;
    TIM_BaseInitStructure.TIM_Prescaler = 72-1;
    TIM_BaseInitStructure.TIM_ClockDivision = 0;
    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
    //启用ARR的影子寄存器(直到产生更新事件才更改设置)
    TIM_ARRPreloadConfig(TIM1, ENABLE);


    //TIM1_OC1模块设置(设置1通道占空比)
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    TIM_OCInitStructure.TIM_Pulse = 120;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

    //TIM2_OC2模块设置(设置2通道占空比)
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 680;
    TIM_OC2Init(TIM1, &TIM_OCInitStructure);
    //启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)
    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
   
    //死区设置
    TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
    TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
    TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
    TIM_BDTRInitStructure.TIM_DeadTime = 0x90//这里调整死区大小0-0xff
    TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
    TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
    TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
    TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
   
    //TIM1开启
    TIM_Cmd(TIM1, ENABLE);
    //TIM1_OC通道输出PWM(一定要加)
    TIM_CtrlPWMOutputs(TIM1, ENABLE);

}
  
  其实,PWM模块还可以有很多花样可以玩,比方在异常时(如CPU时钟有问题),可以紧急关闭输出,以免发生电路烧毁等严重事故。
PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户288425 2010-6-13 00:06

这个代码可以设置出死区时间来吗?我用这种设置试了,但是在示波器上看不到死区延时。其实我试过了很多种方法,并且看技术手册实在看不来还有没有设置好的地方,请指分享一下经验,我用的是107的芯片。谢谢!

用户213184 2009-8-5 15:10

/* WWDG clock counter = (PCLK1/4096)/8 = 244 Hz (~4 ms) */ WWDG_SetPrescaler(WWDG_Prescaler_8);你好,我想问一下WWDG的分频是怎么算的,为什么都要除以一个4096?谢谢!
相关推荐阅读
用户699237 2009-06-04 14:36
发布TBDML Plus用户手册和驱动包
九九的TBDML Plus已经于2009年5月1日正式发售在EDN和21IC上发布TBDML Plus用户使用手册和用户驱动包欢迎各位用户下载使用TBDML Plus用户包下载:https://sta...
用户699237 2009-05-30 16:39
低价供应Freescale飞思卡尔 BDM仿真器 调试器 兼容8/16/32位单片机
本店最新产品的飞思卡尔三合一BDM仿真器TBDML Plus支持S12 S08 ColdFireV1三种内核的仿真调试USB接口 最新JB16+12MHz晶振硬件 仿真速度是原BDM的2倍!超小体积 ...
用户699237 2009-05-20 15:12
隆重发布高速模拟视频解码模块(智能车可用)
关于智能车摄像头的选择,CCD以其高感光度、能在运动时获取较为清晰的图像而成为智能车摄像头的首选,这是一个趋势。详情请搜索《CCD与CMOS摄像头在智能车竞赛中的选择》  同时摄像头的前瞻越来越大,很...
用户699237 2009-05-15 16:45
智能车竞赛中CCD与CMOS摄像头的选择
https://static.assets-stash.eet-china.com/album/old-resources/2009/5/15/3cb54ae1-ee52-4f05-9629-86c2...
用户699237 2009-05-12 21:03
智能车上位机:串口图像显示程序
这是我很久以前写的程序功能很不完善如果要使用 请先把串口调整到COM1 不能在设置窗口中设置串口号 否则会出错同时连拍功能没有实现 嘿嘿 不好意思哦具体如何发送 在readme中有详细解释没空改程序了...
用户699237 2009-05-12 21:02
OV7620 OV6620等CMOS摄像头图像采集的方法
本文由九九原创,发表于《电子技术应用》2008年第9期,版权归作者与出版社所有,转载请务必注明作者出处,谢谢http://shop35388432.taobao.com九九小铺,供应:MC9S12DG...
EE直播间
更多
我要评论
2
8
关闭 站长推荐上一条 /1 下一条