stm32 pwm 正弦波输出问题,求 正弦波采样数据 1024个点 的数据表

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
1、工程的修改 1)这里用到了定时器,所以需要将stm32f10x_tim.h添加到STM32F10x_StdPeriod_Driver工程组中。 2)打开stm32f0x_conf.h文件,将其中原先被屏蔽的语句:#include "stm32f10x_tim.h"的注释去掉。 3)新建SixSteps.c与SixSteps.h两个文件,分别保存在BSP文件夹里下的src与inc中,然后在将SixSteps.c添加到BSP工程组。2、SixSteps.c与SixSteps.h程序的编写 首先是引脚的配置。六步PWM输出可以是TIM1与TIM8两个定时器,这里我选择TIM1。所以我们需要配置的TIM1 的CH1、CH1N、CH2、CH2N、CH3、CH3N这六个通道对应的引脚:PA8、PB13、PA9、PB14、PA10、PB15,把他们都配置成复用个推挽输出模式,这里需要注意的是,PA9也是USART1的RX对应的引脚,所以最好将USART1相关代码屏蔽掉,最起码也要将USART1的RX引脚相关代码屏蔽掉。除此之外,还有一个引脚可以配置也可以不配置,那就是TIM1_BKIN对应的引脚PB12,TIM1_BKIN的功能是检测故障,如果当PB12检测到高电平(故障的电平由软件决定,在之后的代码中会讲到)时,就表示检测到故障,然后它会自动关闭定时器。所以如果你只是平时测试测试,这个引脚完全可以不用管,但是如果用于实际应用的时候,最好将这个引脚配置好。这里我选择配置这个引脚,配置成悬空输入。引脚代码如下:/*************************************************************
: SixSteps_GPIO_Init
Description: 定时器1的引脚配置
*************************************************************/static void SixSteps_GPIO_Init(void){ GPIO_InitTypeDef GPIO_InitS RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); //TIM1的TIM_CH1/TIM_CH2/TIM_CH3对应的引脚(PA9引脚与串口1的TX引脚复用,记得关闭串口1后在使用) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//设置成复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //TIM1的TIM1_CH1N/TIM1_CH2N/TIM1_CH3N对应的引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_Init(GPIOB, &GPIO_InitStructure); //TIM1的故障信号TIM1_BKIN所对应的引脚,不接或者接地,否者就是表示故障,则会关闭定时器 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//设置成浮空输入 GPIO_Init(GPIOB, &GPIO_InitStructure); } 接下去是定时器的配置,代码如下:/*************************************************************
: SixSteps_TIM1_Init
Description: 定时器1初始化
*************************************************************/static void SixSteps_TIM1_Init(void){ TIM_TimeBaseInitTypeDef
TIM_TimeBaseS TIM_OCInitTypeDef
TIM_OCInitS TIM_BDTRInitTypeDef TIM_BDTRInitS RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//初始化TIM1的时钟 /*------------------------------------------------------------- SysTick每100ms进入SysTick中断,产生一个COM事件,触发TIM1中断, TIM1中断服务函数中,每中断一次,就改变个通道的配置,规则如下:
-----------------------------------------------
| Step1 | Step2 | Step3 | Step4 | Step5 | Step6 |
----------------------------------------------------------
----------------------------------------------------------
|Channel1N |
----------------------------------------------------------
----------------------------------------------------------
|Channel2N |
----------------------------------------------------------
----------------------------------------------------------
|Channel3N |
---------------------------------------------------------- -------------------------------------------------------------*/ TIM_TimeBaseStructure.TIM_Prescaler = 0;//不预分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//增计数 TIM_TimeBaseStructure.TIM_Period = 4095;//设置定时器周期 TIM_TimeBaseStructure.TIM_ClockDivision = 0;//时钟不分频 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//不重复计数 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//初始化TIM1时基
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_T//输出比较时间模式,什么都输出 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E//通道输出使能 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_E//互补通道输出使能 TIM_OCInitStructure.TIM_Pulse = 2047;//设置比较值 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_H//通道有效电平为高电平 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_H//互补通道有效电平为高电平 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_S//通道空闲状态为高电平 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_S//互补通道空闲状态为高电平
TIM_OC1Init(TIM1, &TIM_OCInitStructure);//初始化CH1和CH1N
TIM_OCInitStructure.TIM_Pulse = 1023;//设置比较值 TIM_OC2Init(TIM1, &TIM_OCInitStructure);//初始化CH2与CH2N
TIM_OCInitStructure.TIM_Pulse = 511;//设置比较值 TIM_OC3Init(TIM1, &TIM_OCInitStructure);//初始化CH3与CH3N
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_E//运行模式下输出使能 TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_E//空闲模式下输出使能 TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;//不锁定 TIM_BDTRInitStructure.TIM_DeadTime = 1;//时区时间为1 TIM_BDTRInitStructure.TIM_Break = TIM_Break_E//打开刹车功能 TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_H//刹车输入极性为高电平 TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_E//自动输出使能 TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
TIM_CCPreloadControl(TIM1, ENABLE);//打开捕获比较预装载 TIM_ITConfig(TIM1, TIM_IT_COM, ENABLE);//打开OOM(commutation event换向事件) 中断 TIM_Cmd(TIM1, ENABLE);//打开定时器1 TIM_CtrlPWMOutputs(TIM1, ENABLE);//控制定时器输出}先是设置定时器的时间,这里不对定时器做任何分频,设置周期值为4095。接下去在分别设置个通道的配置,CH1与CH1N通道先是设置成输出比较时间模式,可能会有疑问,不是要输出PWM波吗,而输出比较时间模式不做任何输出,为什么要这么设置。没错,程序是要PWM输出,但是这里只是设置初始状态是不做任何输出,在接收到COM事件后,再改变他的模式为PWM输出就可以了。CH1与CH1N的有效电平与空闲状态电平都设置为高电平(不用设置成互补输出),再设置比较值为2047,这样的话可以计算得到CH1与CH1N通道在使能PWM输出后会输出频率为72M/Hz,占空比为50%的PWM波。同样的,设置CH2于CH2N和CH3与CH3N的比较值为,相当于在在使能PWM输出后分别输出占空比为25%与12.5%的PWM波。接下去要设置故障检测与死区的相关设置了。设置在运行模式与空闲模式下都能遵守故障检测与死区设置的"规则",设置死区时间为1个计数时间(死区的概念已经在《STM32 定时器要点》中说过),然后打开刹车功能,这里的刹车功能其实就是用来检测故障的,设置故障检测的标志是高电平(TIM_BreakPolarity_High),也就是说检测到高电平就表示检测到故障。接下去打开不会比较预装载,并同时打开COM换相事件中断。最后在打开定时器,控制定时器输出。 定时器配置中打开COM换相事件中断,所以还需要配置下中断,配置TIM1的中断为COM事件触发中断,优先级设置为2,代码如下:/*************************************************************
: SixSteps_Int_Init
Description: 定时器中断配置
*************************************************************/static void SixSteps_Int_Config(void){ NVIC_InitTypeDef NVIC_InitS NVIC_InitStructure.NVIC_IRQChannel = TIM1_TRG_COM_IRQn;//COM中断 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//优先级为2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } 这里这里还有一个问题,COM换相事件什么时候产生?COM事件可以软件产生,你可以在任何合适的地方调用TIM_GenerateEvent(TIM1, TIM_EventSource_COM);来产生COM换相事件。这里我采用SysTick时钟来定时产生一个COM换相事件,下面就来配置下SysTick,代码如下:/*************************************************************
: SysTick_Init
Description: 系统节拍出初始化
*************************************************************/static void SysTick_Init(void){ //初始化与启动系统时钟,打开它的中断,时间为100ms if (SysTick_Config((SystemCoreClock) / 10)) {
while (1);
NVIC_SetPriority(SysTick_IRQn, 0x1);//配置系统时钟中断优先级为1}这里设置SysTick每100m就进入下SysTick中断,然后设置SysTick的中断优先等级为1。 还要编写一个总函数:SixSteps_Init()来初始化下上面的配置,代码如下:/*************************************************************
: SixSteps_Init
Description: 六步控制初始化
*************************************************************/void SixSteps_Init(void){ SysTick_Init(); SixSteps_GPIO_Init(); SixSteps_TIM1_Init(); SixSteps_Int_Config();} 最后贴上SixSteps.h文件,代码如下:#ifndef __SIXSTEPS_H__#define __SIXSTEPS_H__#include "stm32f10x.h"void SixSteps_Init(void);#endif3、stm32f10x_it的修改 首先是SysTick的中断,每100ms进入这个中断,然后在这个中断中打开COM换相事件,代码如下:/*************************************************************
: SysTick_Handler
Description: 系统节拍中断服务程序,定时周期为100ms
*************************************************************/void SysTick_Handler(void){ TIM_GenerateEvent(TIM1, TIM_EventSource_COM);//每100ms就产生一个COM事件} 还有是COM换相事件的中断函数,代码如下:/*************************************************************
: TIM1_TRG_COM_IRQHandler
Description: COM事件中断服务程序
*************************************************************/void TIM1_TRG_COM_IRQHandler(void){ static u8 step = 1; TIM_ClearITPendingBit(TIM1, TIM_IT_COM);//清除COM事件中断标志
if (step == 1)//第一步 {
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);//关闭CH3输出
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);//关闭CH3N输出
TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);//选择通道配置模式为PWM1模式
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);//打开CH1输出
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);//关闭CH1N输出
TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);//选择通道配置模式为PWM1模式
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);//关闭CH2输出
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);//打开CH2N输出
step++; } else if (step == 2)//第二步 {
TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);//选择通道配置模式为PWM1模式
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);//关闭CH2输出
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);//打开CH2N输出
TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);//选择通道配置模式为PWM1模式
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);//打开CH3输出
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);//关闭CH3N输出
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);//关闭CH1输出
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);//关闭CH1N输出
step++; } else if (step == 3)//第三步 {
TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);//选择通道配置模式为PWM1模式
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);//打开CH3输出
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);//关闭CH3N输出
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);//关闭CH3输出
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);//关闭CH3N输出
TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);//选择通道配置模式为PWM1模式
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);//关闭CH1输出
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable);//打开CH1N输出
step++; } else if (step == 4)//第四步 {
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);//关闭CH3输出
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);//关闭CH3N输出
TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);//选择通道配置模式为PWM1模式
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);//关闭CH1输出
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable);//关闭CH1N输出
TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);//选择通道配置模式为PWM1模式
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable);//打开CH2输出
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);//关闭CH2N输出
step++; } else if (step == 5)//第五步 {
TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);//选择通道配置模式为PWM1模式
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);//关闭CH3输出
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable);//打开CH3N输出
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);//关闭CH1输出
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);//关闭CH1N输出
TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);//选择通道配置模式为PWM1模式
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable);//打开CH2输出
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);//关闭CH2N输出
step++; } else//第六步 {
TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);//选择通道配置模式为PWM1模式
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);//打开CH1输出
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);//关闭CH1N输出
TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);//选择通道配置模式为PWM1模式
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);//关闭CH3输出
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable);//打开CH3N输出
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);//关闭CH2输出
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);//关闭CH2N输出
step = 1; }}当发生COM换相事件的时候就会进入这个中断,然后清除COM事件中中断标志。第一次发生进入第一步,第二次发生进入第二步 ……第六次发生进入第六步,当再次发生事件时,重新进入第一步。这六步我只详细讲第一步,其他步都类似的。在第一步时,打开CH1的PWM输出,关闭CH1N的PWM输出;打开CH2N的PWM输出,关闭CH2的PWM输出;关闭CH3和CH3N的PWM输出。这里的TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);就是设置输出比较模式为PWM1模式,所以说原先在定时器配置时不急着设置PWM1,在这里才设置输出比较时间模式。其他步都差不多,各通道引脚输出的规律如下:&&第一步第二步&第三步第四步第五步第六步&Channel1&100001&&Channel1N&00&&11&&00&&Channel2&00&&01&10&Channel2N&11&&0&0&0&0&Channel3&01&&1&0&0&0&Channel3N&0&0&0&0&1&14、main函数的编写 main函数很简单,代码如下:/*************************************************************
Description: main入口
*************************************************************/int main(void){
BSP_Init(); SixSteps_Init(); while(1) {
LED1_Toggle();
Delay_ms(1000); }}5、测试 这个还程序还真是很难测试,因为示波器通常只能测试2路的通道,所以要测试上面的代码是否正确,只能两路两路测试。示波器两个探头分别测试CH1与CH1N两路输出的PWM波,看是不是与上面给出的表格的规则变化着。CH2与CH2N 、CH3与CH3N也是一样,如果一样说明是正确的!(我这里有示波器只有一个探头,所以我这里暂时无法测试!)
阅读(534)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'STM32 六步PWM输出',
blogAbstract:'\t之前说过STM32的只有两个高级定时器TIM1与TIM8才能互补输出。这里我们说的六步PWM输出要用到互补输出,所以只有TIM1与TIM8才能实现。什么是六步PWM输出?下面就来解释下。当一个定时器需要互补输出的时候,可以预先设置输出比较模式位OCxM(向TIM_OCMode_Timing,TIM_OCMode_PWM1等)、通道的使能位CCxE、互补通道的使能位CCxNE,然后当发生COM换相事件时,就可在中断函数中将刚预先设置位设置好,这样的话,就决定了下一步的配置了。这里之所以说是六步,其实并不是说一定要六步,你完全可以自己决定要设置几步配置,但是六步配置最为典型,所以我这里只讲六步配置。六步PWM输出非常适合控制机器人,因为可以用六步的配置来实现机器人接下去的六个动作。如果还是不明白就得往下看代码了。',
blogTag:'stm32,六步,pwm',
blogUrl:'blog/static/3',
isPublished:1,
istop:false,
modifyTime:6,
publishTime:9,
permalink:'blog/static/3',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}STM32同一个定时器PWM输出的同时捕获PWM输入,遇到问题==
热门型号:
&&&当前位置:
STM32同一个定时器PWM输出的同时捕获PWM输入,遇到问题
用户名:honami520
注册时间: 14:30:00
STM32同一个定时器PWM输出的同时捕获PWM输入,遇到问题
void TIM2_PWM_INIT(void)
//TIM3配置PWM输出参数 {
u32 temp_fre,temp_
TempE = 30;
//设置频率初始值
TempF = 4;
//设置初始占空比1 / 2
temp_fre = ( / TempE) - 1;
temp_duty = ((temp_fre + 1) / TempF);
TIM_TimeBaseStructure.TIM_Period = temp_
//TIM3通道4的频率
TIM_TimeBaseStructure.TIM_Prescaler = 72;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E
TIM_OCInitStructure.TIM_Pulse = temp_
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_H
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_Cmd(TIM2, ENABLE);
} void TIM2_PWM_IN_INIT(void) {
TIM_ICInitTypeDefTIM_ICInitS
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_R
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
/* Select the TIM2 Input Trigger: TI2FP2 */
TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
/* Select the slave Mode: Reset Mode */
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
/* Enable the Master/Slave Mode */
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
/* TIM enable counter */
TIM_Cmd(TIM2, ENABLE);
/* Enable the CC2 Interrupt Request */
TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE); }请看上面的例子!使用TIM2的通道4输出PWM,同时通道2作为PWM捕获输入;发现个现象,PWM输入的频率最小值不能小于PWM输出的值。程序里写的是30HZ,那么输入的PWM波形频率不能小于30HZ;然后,用示波器观察,TIM2的PWM输出频率不能小于50HZ,程序里设置的30HZ,按照理论计算72分频后,36 < 20HZ的。可是没办法输出低于50HZ的PWM,请知道的指点一下啊!没办法,我要用来输出4路频率可调,脉宽可调的PWM,还要输入一路PWM,定时器1,2,3,4都用完了,要是再多个定时器就好了!
用户名:honami520
注册时间: 16:37:00
怎么没有人给我指点一下迷津啊!
用户名:香水城
注册时间: 18:42:00
1)“发现个现象,PWM输入的频率最小值不能小于PWM输出的值”,这是肯定的!作为PWM输出时,计数器从0累计到你设定的temp_fre,所以作为PWM输入时,只能捕获到temp_fre以下的数值。
2)“用示波器观察,TIM2的PWM输出频率不能小于50HZ,程序里设置的30HZ,按照理论计算72分频后,36 & 20HZ的。可是没办法输出低于50HZ的PWM”,不明白你看到了什么?
3)“我要用STM32F103C8T6来输出4路频率可调,脉宽可调的PWM,还要输入一路PWM”,请按照1),找一个最小频率的定时器做为PWM输入,如果输入的频率比较低,可以利用PWM输出时的溢出中断,在中断处理中计数,然后再补偿到输入捕获的数值中。
用户名:honami520
注册时间: 22:37:00
为什么我的PWM输出频率不能低于50HZ啊
用户名:香水城
注册时间: 23:06:00
为什么我的PWM输出频率不能低于50HZ啊
honami520 发表于
用户名:honami520
注册时间: 14:04:00
搞定了。没有用PWM模式。用了一路定时器,输出比较模式,通过中断控制来实现了4路频率可调,脉宽可调的PWM。还挺好用。然后我就有N个定时器可用了。另外一路作为PWM输入。哈,现在问题都解决了!
用户名:xuyiyi
注册时间: 14:48:00
这是好事,恭喜LZ
热门型号:>> STM32F103 -PWM波发一定脉冲数输出
STM32F103 -PWM波发一定脉冲数输出
所属分类:
下载地址:
PWM 一定脉冲数.rar文件大小:2.31 MB
分享有礼! 》
请点击右侧的分享按钮,把本代码分享到各社交媒体。
通过您的分享链接访问Codeforge,每来2个新的IP,您将获得0.1 积分的奖励。
通过您的分享链接,每成功注册一个用户,该用户在Codeforge上所获得的每1个积分,您都将获得0.2 积分的分成奖励。
本代码使用STM32F103控制器,定时器输出PWM波,利用自己编写的代码控制输出脉冲数的输出,做到步进电或伺服电机位置控制的功能。代码已测试成功,准确输出一定数量的PWM脉冲。由于本代码是自己本人写的,可能有些不是很完善的地方,若有错误的地方请指出。
Sponsored links
源码文件列表
温馨提示: 点击源码文件名可预览文件内容哦 ^_^
16.87 kB07-06-10 10:25
83.71 kB09-02-11 14:59
startup_stm32f10x_hd.s15.14 kB10-03-11 10:52
1.78 kB20-03-15 12:41
1.16 kB19-03-15 16:14
1.28 kB05-05-16 18:57
638.00 B13-09-12 09:45
4.45 kB22-04-16 19:37
617.00 B14-09-12 20:43
399.00 B23-04-11 10:24
core_cm3.crf3.85 kB05-05-16 18:55
core_cm3.d104.00 B05-05-16 18:55
core_cm3.o11.10 kB05-05-16 18:55
delay.crf341.75 kB05-05-16 18:55
delay.d1.63 kB05-05-16 18:55
delay.o375.25 kB05-05-16 18:55
key.crf342.26 kB05-05-16 18:54
key.d1.60 kB05-05-16 18:54
key.o376.16 kB05-05-16 18:54
led.crf341.32 kB05-05-16 18:57
led.d1.56 kB05-05-16 18:57
led.o374.18 kB05-05-16 18:57
main.crf346.76 kB05-05-16 19:08
main.d1.79 kB05-05-16 19:08
main.o381.33 kB05-05-16 19:08
misc.crf340.72 kB05-05-16 18:55
misc.d1.58 kB05-05-16 18:55
misc.o372.76 kB05-05-16 18:55
PWM.axf342.20 kB05-05-16 19:08
1.27 kB05-05-16 19:08
PWM.hex25.67 kB05-05-16 19:08
72.37 kB05-05-16 19:08
PWM.lnp571.00 B05-05-16 19:08
PWM.sct479.00 B20-03-16 20:48
PWM_PWM.dep31.32 kB05-05-16 19:08
startup_stm32f10x_hd.d63.00 B05-05-16 18:55
startup_stm32f10x_hd.o6.67 kB05-05-16 18:55
stm32f10x_gpio.crf344.14 kB05-05-16 18:55
stm32f10x_gpio.d1.90 kB05-05-16 18:55
stm32f10x_gpio.o378.96 kB05-05-16 18:55
stm32f10x_it.crf340.14 kB05-05-16 18:54
stm32f10x_it.d1.76 kB05-05-16 18:54
stm32f10x_it.o373.13 kB05-05-16 18:54
stm32f10x_rcc.crf347.63 kB05-05-16 18:55
stm32f10x_rcc.d1.87 kB05-05-16 18:55
stm32f10x_rcc.o383.34 kB05-05-16 18:55
stm32f10x_tim.crf362.29 kB05-05-16 18:55
stm32f10x_tim.d1.87 kB05-05-16 18:55
stm32f10x_tim.o406.43 kB05-05-16 18:55
stm32f10x_usart.crf346.20 kB05-05-16 18:55
stm32f10x_usart.d1.93 kB05-05-16 18:55
stm32f10x_usart.o383.00 kB05-05-16 18:55
sys.crf340.96 kB05-05-16 18:55
sys.d1.53 kB05-05-16 18:55
sys.o375.02 kB05-05-16 18:55
system_stm32f10x.crf341.83 kB05-05-16 18:54
system_stm32f10x.d1.85 kB05-05-16 18:54
system_stm32f10x.o373.03 kB05-05-16 18:54
timer.crf346.82 kB05-05-16 18:55
timer.d1.77 kB05-05-16 18:55
timer.o379.88 kB05-05-16 18:55
usart.crf346.29 kB05-05-16 18:55
usart.d1.69 kB05-05-16 18:55
usart.o378.61 kB05-05-16 18:55
1.79 kB23-03-15 21:08
8.77 kB10-03-11 10:47
21.18 kB10-03-11 10:47
7.38 kB10-03-11 10:47
26.91 kB10-03-11 10:47
6.42 kB10-03-11 10:47
2.11 kB10-03-11 10:47
14.88 kB10-03-11 10:47
3.73 kB10-03-11 10:47
20.27 kB10-03-11 10:47
6.66 kB10-03-11 10:47
24.85 kB10-03-11 10:47
26.38 kB10-03-11 10:47
19.70 kB10-03-11 10:47
29.33 kB10-03-11 10:47
3.74 kB10-03-11 10:47
4.28 kB10-03-11 10:47
29.74 kB10-03-11 10:47
3.77 kB10-03-11 10:47
21.35 kB10-03-11 10:47
17.31 kB10-03-11 10:47
51.20 kB10-03-11 10:47
16.16 kB10-03-11 10:47
2.90 kB10-03-11 10:47
6.88 kB10-03-11 10:47
46.09 kB10-03-11 10:47
8.26 kB10-03-11 10:47
44.05 kB10-03-11 10:47
11.38 kB10-03-11 10:47
3.27 kB10-03-11 10:47
18.64 kB10-03-11 10:47
5.03 kB10-03-11 10:47
28.91 kB10-03-11 10:47
6.80 kB10-03-11 10:47
61.08 kB10-03-11 10:47
34.65 kB10-03-11 10:47
22.68 kB14-09-12 20:51
44.71 kB10-03-11 10:47
4.80 kB10-03-11 10:47
8.55 kB10-03-11 10:47
50.07 kB10-03-11 10:47
8.40 kB10-03-11 10:47
28.25 kB10-03-11 10:47
29.52 kB10-03-11 10:47
106.60 kB14-09-12 21:24
37.41 kB10-03-11 10:47
5.60 kB10-03-11 10:47
7.74 kB19-05-15 13:20
1.94 kB19-05-15 13:20
876.00 B12-03-15 20:20
2.74 kB23-03-15 12:22
4.97 kB23-03-15 12:28
1.25 kB13-09-12 14:17
bujindianji1.42 kB21-04-16 20:48
PWM_STM32F103ZE.dbgconf6.79 kB10-12-15 17:06
671.00 B12-03-15 21:56
1.96 kB05-05-16 19:08
PWM.map79.78 kB05-05-16 19:08
PWM.uvguix.Administrator68.19 kB13-08-15 11:17
PWM.uvguix.Koby71.93 kB05-05-16 19:12
PWM.uvoptx14.08 kB05-05-16 19:12
PWM.uvprojx18.51 kB05-05-16 19:12
startup_stm32f10x_hd.lst49.98 kB05-05-16 18:55
619.08 kB09-09-12 23:36
3.16 kB12-03-15 21:09
2.36 kB13-11-11 01:28
1.94 kB04-04-11 18:57
35.72 kB04-04-11 18:57
2.04 kB10-03-11 10:51
&KEY&0.00 B22-04-16 14:17
&LED&0.00 B05-05-16 18:57
&TIMER&0.00 B22-04-16 19:37
&inc&0.00 B22-04-16 14:17
&src&0.00 B22-04-16 14:17
&delay&0.00 B22-04-16 14:17
&sys&0.00 B22-04-16 14:17
&usart&0.00 B22-04-16 14:17
&DebugConfig&0.00 B05-05-16 18:54
&CORE&0.00 B22-04-16 14:17
&HARDWARE&0.00 B22-04-16 14:17
&OBJ&0.00 B05-05-16 19:08
&STM32F10x_FWLib&0.00 B22-04-16 14:17
&SYSTEM&0.00 B22-04-16 14:17
&USER&0.00 B05-05-16 19:12
&PWM&0.00 B0% 22-04-16
(提交有效评论获得积分)
评论内容不能少于15个字,不要超出160个字。
badkin1573又要积分,,,,
评价成功,多谢!
下载PWM 一定脉冲数.rar
CodeForge积分(原CF币)全新升级,功能更强大,使用更便捷,不仅可以用来下载海量源代码马上还可兑换精美小礼品了
您的积分不足,优惠套餐快速获取 30 积分
10积分 / ¥100
30积分 / ¥200原价 ¥300 元
100积分 / ¥500原价 ¥1000 元
订单支付完成后,积分将自动加入到您的账号。以下是优惠期的人民币价格,优惠期过后将恢复美元价格。
支付宝支付宝付款
微信钱包微信付款
更多付款方式:、
您本次下载所消耗的积分将转交上传作者。
同一源码,30天内重复下载,只扣除一次积分。
鲁ICP备号-3 runtime:Elapsed:373.038ms - init:0.1;find:0.9;t:0.6;tags:0.2;related:290.6;comment:4.3; 5.8
登录 CodeForge
还没有CodeForge账号?
Switch to the English version?
^_^"呃 ...
Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧

我要回帖

更多关于 stm32输出正弦波 的文章

 

随机推荐