STM32日记之TIM1模块产生PWM(分别用库函数和寄存器)

C语言:TIM1模块产生PWM,带死区//Step1.开启TIM和相应端口时钟//启动GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|\RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,\ENABLE);//启动AFIORCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//启动TIM1RCC_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模块初始化voidTIM_Configuration(void){TIM_TimeBaseInitTypeDefTIM_BaseInitStructure;TIM_OCInitTypeDefTIM_OCInitStructure;TIM_BDTRInitTypeDefTIM_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;//TIM1_Pulse设置了待装入捕获比较寄存器的脉冲值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-0xffTIM_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);}另一程序---------------------------------#include#include"PWM.h"//头文件#include"IOSET.h"//包含io口设置头文件u16pw1=0;u16pw2=5600;u16pw3=2800;voidPWM_Init(u16arr,u16psc)//PWM初始化程序{RCC->APB2ENR|=1<<11;//使能定时器1时钟RCC->APB2ENR|=1<<2;//使能IO口A时钟RCC->APB2ENR|=1<<3;//使能IO口B时钟RCC->APB2ENR|=1<<0;//开启辅助时钟GPIOB->CRH&=0X000FFFFF;//清除PB13PB14,15状态寄存器位GPIOB->CRH|=0XBBB00000;//设定PB13PB14,15//TIM1CH1N,TIM1CHH2NCH3N输出GPIOA->CRH&=0XFFFFF000;//清除PA8,9,10状态寄存器位GPIOA->CRH|=0X00000BBB;//设定PA8,9,10为复用功能TIM1CH1,2,3输出GPIOB->ODR|=1<<13;GPIOB->ODR|=1<<14;GPIOB->ODR|=1<<15;//输出上拉,低电平有效GPIOA->ODR|=1<<8;GPIOA->ODR|=1<<9;GPIOA->ODR|=1<<10;TIM1->CCR1=pw1;//捕获比较预装载值TIM1->CCR2=pw2;TIM1->CCR3=pw3;TIM1->ARR=arr;//设定计数器自动重装值TIM1->PSC=psc;//预分频器不分频TIM1->BDTR|=0xCD;//死区时间设定TIM1->CCER|=1<<0;//TIM1CH1通道开关TIM1->CCER|=1<<2;//TIM1CH1N通道开关TIM1->CCER|=1<<4;//TIM1CH2通道开关TIM1->CCER|=1<<6;//TIM4CH2N通道开关TIM1->CCER|=1<<8;//TIM4CH3通道开关TIM1->CCER|=1<<10;//TIM4CH3N通道开关TIM1->CCMR1|=7<<4;//TIM1CH1PWM2模式TIM1->CCMR1|=7<<12;//TIM1CH2PWM2模式TIM1->CCMR2|=7<<4;//TIM1CH3PWM2模式TIM1->CCMR1|=1<<3;//TIM1CH1预装载使能TIM1->CCMR1|=1<<11;//TIM1CH2预装载使能TIM1->CCMR2|=1<<3;//TIM1CH3预装载使能TIM1->CR1|=0X80;//CR1ARPE自动重装载预装载允许位使能TIM1->BDTR|=1<<15;//刹车使能位置1,开启所有输出通道TIM1->CR1|=0X01;//使能定时计数器1//TIM1->EGR|=1<<0;}

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

确认删除?