历史上的今天
今天是:2025年06月17日(星期二)
2020年06月17日 | 采用TIM1高级定时器产生PWM
2020-06-17 来源:eefocus
简介
STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和 TIME7 等基本定时器。而每种定时器的使用方法略有不同,之前写产生pwm的程序使用的都是通用定时器,今天使用高级定时器TIM1时发现怎么也产生不了,后来才知道使用TIM1时,需要多添加两行代码
//重复计数器的值
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
// 主输出使能,当使用的是通用定时器时,这句不需要
TIM_CtrlPWMOutputs(TIM1, ENABLE);
高级定时器TIM1的TIM1_TIM1BaseInitTypeDef结构体

TIM1_RepetitionCounter是高级定时器特有的一个值,使用时需要对其进行初始化

主输出使能,使用的是高级定时器时,需要添加这个函数

参考代码
控制GPIO PA8/PA11产生PWM来控制两个舵机
TIM1_CH1/TIM1_CH4

void TIM1_PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器
TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx
/* 开启时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/* 配置GPIO的模式和IO口 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
//TIM1定时器初始化
TIM_TimeBaseInitStructure.TIM_Period = 199;//900; //不分频,PWM 频率=72000/900=8Khz//设置自动重装载寄存器周期的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//0;//设置用来作为TIMx时钟频率预分频值,100Khz计数频率
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
// 重复计数器的值,没用到不用管
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1, & TIM_TimeBaseInitStructure);
//PWM初始化
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OC1Init(TIM1,&TIM_OCInitStructure);
TIM_OC4Init(TIM1,&TIM_OCInitStructure);
//注意此处初始化时TIM_OC2Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR2上的预装载寄存器
TIM_Cmd(TIM1,ENABLE);//使能或者失能TIMx外设
// 主输出使能,当使用的是通用定时器时,这句不需要
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
int main()
{
TIM1_PWM_Init();
while(1)
{
TIM_SetCompare1(TIM1, 195);//0度
delay_ms(100);
TIM_SetCompare1(TIM1, 190);//45度
delay_ms(100);
TIM_SetCompare4(TIM1, 195);//0度
delay_ms(100);
TIM_SetCompare4(TIM1, 190);//45度
delay_ms(100);
}
}
上一篇:STM32定时器控制led灯亮灭
史海拾趣
|
1 引言 目前,以太网(Ethernet)协议已经非常广泛地应用于各种计算机网络,如办公局域网、工业控制网络等场合,并且还不断地发展。基于以太网的新技术和联网设备不断出现,以太网已经成为事实上最常用的局域网络标准之一。但是,基于以太网的 ...… 查看全部问答> |
|
各位高手:我在EVC下写了一个显示JPG图片的程序,可是在调用CoCreateInstance时总是失败,脆求高手指点啊! IImagingFactory *pImageFactory = NULL; IImage *pImage = NULL; CoInitializeEx(NULL,COINIT_MULTITHREADED); if(SUCCEEDED(CoCreat ...… 查看全部问答> |
|
各位好:我的平台基于WINCE5.0 上面有带CF 的WIFI.一旦无线网卡连接上网络,我打开Explorer 没有下面的错误信息出现。如果拔掉网卡,在打开EXPLORER 就会出现下面的信息,请问如何解决 谢谢 RaiseException: Thread=87647640 Proc=8299add0 \'ie ...… 查看全部问答> |
|
感觉ISP下载,还得占用串口。开发的时候用SWD,下载时如果也能用SWD口就好了。 现在这个ST-Link Utility好像可以实现这个功能。但是出于代码保密考虑,想自己编写个类似功能的软件,可是怎么做呢? 所以希望这个软件的代码能公开,或者把相 ...… 查看全部问答> |
|
设计一个电路利用了7.4V的锂电池,但是工作电压为5v。这个电路的电流大约为150ma左右,应该用什么转换芯片呢?主要是考虑在锂电池正常工作的时候可以输出7.4V的电压,可是当电压下降之后如何保证输出为5V,因此想选一个输入电压范围比较宽的,有哪 ...… 查看全部问答> |
|
下面是我编写的MSP430f149的485通信小程序,请各位大侠看看问题出在哪里? 程序目的:想用串口精灵发送一个字节数据给单片机,然后单片机再将接受的数据回发给串口精灵。 下面是错误的现象描述: 1.C:\\Users\\panruifeng\\Desktop\\1.jpg串口精 ...… 查看全部问答> |
|
产品说明书中提供了带有相应容差范围的额定 00C 电压与温度系数。额定 00C 电压规定为986mV,其最大误差为 +/- 5%。因此,温度传感器的 00C 电压在最恶劣的环境下,每个器件可能会相差几乎 +/- 50mV。这大约等于 +/- 14C。请注意,这种差异主要与各 ...… 查看全部问答> |




