完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
11 个讨论
|
|
|
使用定时器中断,在定时器中断里通过判断ASCII码值,来改变CCRx的大小
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
你好,我的看法如下: 1.根据工程要求,我觉得使用PWM模式就行,stm32参考手册上对该模式的的定义是:“脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。” 2.TIM_OCInitStructure.TIM_Pulse 是设置跳变值用的,当计数器计数到这个值时,电平发生跳变 ,你可以先给它一个初始值,然后通过在TIMx中断函数里改变TIMx_CCRx的值来改变它。 3.我贴一段该模式的代码,供你参考: /**************************************************************************** * 名 称: TIM3_PWM_Config * 功 能:配置TIM3输出的 PWM 信号的模式,如周期、极性、占空比 * 入口参数:无 * 出口参数:无 * 说 明: * 调用方法:无 ****************************************************************************/ void TIM3_PWM_Config() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 结构体 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//打开TIM3时钟 TIM_TimeBaseStructure.TIM_Prescaler = 36-1; //设置预分频;1MHz TIM_TimeBaseStructure.TIM_Period = 40000-1; //PWM周期 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分频系数:不分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //使用TIM3 /* PWM1 Mode configuration: Ch1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //设置跳变值,当计数器计数到这个值时,电平发生跳变 TIM_OCInitStructure.TIM_Pulse = 1600; //当定时器计数值小于CCR1_Val时为高电平 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ClearFlag(TIM3,TIM_FLAG_CC1); //清除定时器中断标志 TIM_ITConfig(TIM3,TIM_IT_CC1,ENABLE); //使能中断 //使能 TIM3定时器 TIM_Cmd(TIM3, ENABLE); } void TIM3_IRQHandler() { static int i=0; //溢出中断 if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_CC1); if(i<500) {i++;TIM3->CCR1=2000} if(i>=500) { TIM3->CCR1=4000; } } } 这个是用来输出一通道前期占空比为 2000/40000的脉冲波,过20s后输出占空比为10%的脉冲波 类似的,你可以将ASCII码值通过switch函数对应不同的TIMx_CCRx的值,从而输出不同波形,代码具体实现,还是自己写比较好。 4.本人水平有限,如有错误和疏忽,请指正。 |
|
|
|
|
|
|
|
|
本帖最后由 skyfly_HUT 于 2014-4-9 17:35 编辑
TIM_OCInitStructure.TIM_Pulse = 1600;设置为1600,只是因为我随便给的初始值,占空比50%是通过中断服务函数中这句: if(i<500) {i++;TIM3->CCR1=2000}来实现的,TIM_Pulse 是TIM_OCInitStructure这个结构体中的变量,TIMx_CCRx是计数寄存器的值,这两者都可以改变占空比,只是改变TIM_Pulse麻烦,每次都要声明一个结构体,然后将数据写入;CCRx则不同,它是寄存器,操作起来很方便,就跟51一样,直接对寄存器赋值。
|
|
|
|
|
|
|
|
|
我觉得你用串口接收数据,就在串口中断服务函数里面CCRx的值,从而改变占空比,我没试过,所以不敢保证能行,你试试看 |
|
|
|
|
|
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2810 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2420 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2288 浏览 0 评论
2404 浏览 1 评论
1643 浏览 1 评论
浏览过的版块 |
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 16:27 , Processed in 1.687403 second(s), Total 71, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1833