完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这美妙的波形,真好,我他喵的终于把你弄出来了。
STM32F103C8T6使用定时器TIM4进行双通道的PWM输出: 下面的图是从STM32中文参考手册中截取的,定时器TIM4的通用和复用功能I/O 我选用的是TIM4_CH1和TIM4_CH2也就是PB6和PB7输出。 注意事项: 输出PWM是属于IO口的复用功能,所以在设置GPIO_Mode的时候一定要设置为GPIO_Mode_AF_PP也就是推挽复用。 我就是被这个卡了好长时间……,感觉自己蠢到家了。 我是用的正点原子的精英板学的32,所以一些写代码的习惯都是学的正点原子的。 下面是代码 timer.c #include "timer.h" //TIM4 PWM部分初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM4_PWM_Init(u16 arr,u16 psc) { //**结构体声明**// GPIO_InitTypeDef GPIO_InitStructure; //声明GPIO TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //声明定时器 TIM_OCInitTypeDef TIM_OCInitStructure; //声明PWM通道 //**时钟使能**// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器TIM4时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟 //****// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //LED0-->PB.6 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.6 GPIO_SetBits(GPIOB,GPIO_Pin_6); //****// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //LED0-->PB.7 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.7 GPIO_SetBits(GPIOB,GPIO_Pin_7); //初始化TIM3 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM3 Channel1 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 TIM_OC1Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC1 //初始化TIM3 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 TIM_OC2Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2 TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4_CH1预装载寄存器 TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4_CH2预装载寄存器 TIM_Cmd(TIM4, ENABLE); //使能TIM3 } timer.h #ifndef __TIMER_H #define __TIMER_H #include "sys.h" void TIM4_PWM_Init(u16 arr,u16 psc); #endif main.c #include "delay.h" #include "sys.h" #include "timer.h" int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 TIM4_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khz while(1) { TIM_SetCompare1(TIM4,400); //TIM4->CCR1=400 TIM_SetCompare2(TIM4,800); //TIM4->CCR2=800 } } |
|
|
|
只有小组成员才能发言,加入小组>>
3318 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9063 浏览 16 评论
4088 浏览 18 评论
1180浏览 3评论
608浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
600浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 18:24 , Processed in 1.011650 second(s), Total 47, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号