STM32的SPI发送卡死问题PWM问题

STM32的PWM控制_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32的PWM控制
&&STM32的PWM控制
你可能喜欢stm32 TIM输出pwm有些通道不能输出的问题
stm32f103RC今天晚上在玩舵机,看了一下例程的代码,于是想换个通道实践一下,于是想把TIM1的通道由ch1换到ch2,于是就把搞了PA8换成了PA9(数据手册上有),把TIM_OC1PreloadConfig换成了TIM_OC2PreloadConfig,试了一下不行,后来又找哪里的OC1没换成OC2,发现TIM_OC1Init没换,于是换成TIM_OC2Init,试了一下还是不行,又在pwm.c里找了好久找不到,网上找答案,以为ch2是默认关闭的,发现不是,后来终于发现主函数里的TIM_SetCompare1没换成TIM_SetCompare2,这种粗心花了我一个小时找答案。。。
stm32 PWM各通道配置引脚
stm32 pwm输出异常及解决过程
STM32端口重映射
STM32试题及答案
TIM1实现输出PWM波形
STM32 多通道PWM
STM32 TIM1的PWM没有输出
STM32 I/O口不能正常输出高低电平问题的解决方案
STM32学习笔记(3):通用输入输出端口(GPIO Ports)
STM32引脚开漏输出不能上拉到5V问题一则
没有更多推荐了,STM32F407用PWM的问题??谢谢 - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 2178|回复: 2
STM32F407用PWM的问题??谢谢
在线时间4 小时
该用户从未签到主题帖子精华
新手上路, 积分 45, 距离下一级还需 5 积分
& && &最近在做一个项目,需要用到STM32F407的定时器产生一个频率可调的PWM驱动电机,思路是这样的??
& &&&需要放出的PWM放在两个数组里面,cycles表示需要放脉冲的时间(按照定时器单位周期为单位),steps表示在指定的cycles时间内需要放出的脉冲的数量。表示如下:
int16_t steps[10] = {5,-5,6,-7,8,-9,0,3};
uint32_t cycles[10] = {256,,44,5647343};复制代码
& &&&最后用STM32F407的PF9(TIM14)作为PWM输出引脚,PC2作为方向引脚,
& && & 思路大概是:我首先开启定时器(定时10ms),在第一次中断中记录该次pwm脉冲的宽度,并把值转化为PSC和ARR的值,采用自动重装模式,也就是在本次中断里面计算出下一个脉冲的宽度,最后选择在中断时自动PSC和ARR的值,进行放脉冲(第一个10ms中断目的就是重装第一个pwm脉冲的宽度,在 10ms之后放出)。
& && &最后发现实际放出的脉冲数组的每段少放一个脉冲,比如数组的第一列,在354672个周期内放出5个脉冲,实际只放出了4个脉冲,少了一个,数组的每列都少放了一个脉冲,不知道什么情况,我猜测是不是寄存器重装(PSC和ARR的值)装载出了问题?这一块由于不是很熟悉,调试了一个上午,现象依旧,大家帮忙看一下代码?非常感谢!
& && &初始化函数:
void Motor_Init_T1(void)
{
//定义IO口初始化变量
GPIO_InitTypeDef GPIO_InitS
//定义定时器初始化变量
TIM_TimeBaseInitTypeDef TIM_TimeBaseS
TIM_OCInitTypeDef TIM_OCInitS
NVIC_InitTypeDef& && &&&NVIC_InitS
//定时器时钟初始化
RCC_APB1PeriphClockCmd(MOTOR1_TIMER_CLOCK, ENABLE);
//IO口时钟初始化
RCC_AHB1PeriphClockCmd(MOTOR1_PU_CLOCK | MOTOR1_DR_CLOCK, ENABLE);
//MOTOR_DR1 IO口初始化
GPIO_InitStructure.GPIO_Pin = MOTOR1_DR_PIN;& && &&&
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;& && &&&
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;& && &&&
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;& && &&&
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(MOTOR1_DR_BASE, &GPIO_InitStructure);
//初始化方向引脚电平
MOTOR_DR_OUTBIT = 1;
//初始化MOTOR_PU IO口
GPIO_InitStructure.GPIO_Pin = MOTOR1_PU_PIN ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(MOTOR1_PU_BASE, &GPIO_InitStructure);
//设置定时器PWM输出到MOTOR_PU1引脚上
GPIO_PinAFConfig(MOTOR1_PU_BASE, MOTOR1_PU_PINSOURCE, GPIO_AF_TIM14);
//定时器中断初始化
NVIC_InitStructure.NVIC_IRQChannel = TIM8_TRG_COM_TIM14_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//定时器初始化
TIM_DeInit(TIM14);
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = 839;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E
TIM_OCInitStructure.TIM_Pulse = 0
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_H
TIM_OC1Init(TIM14, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
TIM_ClearFlag(TIM14, TIM_FLAG_Update);
TIM_ITConfig(TIM14, TIM_IT_Update, ENABLE);
TIM_ARRPreloadConfig(TIM14, ENABLE);
TIM_Cmd(TIM14, DISABLE);
& &&&定时器溢出中断处理函数:
uint16_t& && &&&serial = 0;
uint16_t& && &&&serialOld = 0;
int16_t& && &&&dir = 1;
uint16_t count = 0;
uint16_t& && &&&period = 1000, prescaler = 840;
uint16_t& && &&&pulse = 0
uint16_t error = 0; //误差累计值,计算脉冲的时间产生的误差,叠加到下一个脉冲中去)
uint32_t times = 0;
uint16_t& && &&&serialNums = 1;//要放出脉冲的数组的个数(小于数据的长度即可)
uint16_t& && &&&stepNums = 0;
void Motor_ISR_T1( const int16_t * pSteps, const uint32_t& && &&&* pCycles)
{
uint32_t& && &&&timerPwm = 0;
if(serial &= serialNums)
{
TIM_SetCompare1(TIM14,pulse);& && &&&
}
if(count == 0)
{
if(serial & serialNums)
{
if(pSteps[serial] & 0)
{
MOTOR_DR_OUTBIT = 1;& && &&&//正方向
count = pSteps[serial];
}
else if(pSteps[serial] & 0)
{
MOTOR_DR_OUTBIT = 0;& && &&&//反方向
count = -pSteps[serial];
}
else if (pSteps[serial] == 0)
{
count = 5;
}
times = pCycles[serial] +
serial++;
serialOld = serial - 1;
}
else if(serial == serialNums)
{
serial++;
}
else if(serial & serialNums)& && &&&//脉冲已经全部放完
{
Motor_Stop_T1();
}
}
if(count & 0)& && &&&//有脉冲需要放
{& && &&&
timerPwm = times/
prescaler = (timerPwm && 16) + 1;
period = timerPwm/
error = timerPwm - period *
times = times - timerPwm +
TIM_PrescalerConfig(TIM14, prescaler - 1, TIM_PSCReloadMode_Update);
TIM_SetAutoreload(TIM14, period - 1);
if(pSteps[serialOld] == 0)
{
pulse = 0
}
else
{
pulse = period - (4000/prescaler + 1);
}
count--;
}
}复制代码
& && && && && &这里serialNums 为1表示只放出数组的第一列的数据,5个脉冲,实际只放出了4个,如果取2,表示只放出2列总计10个脉冲,前面5个正转,后面5个反转,但是实际只放出了4+4 = 8个脉冲,就是数据每一列都会少放一个脉冲!!!
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间292 小时
ST金币1724
该用户从未签到主题帖子精华
回帖奖励 +3 ST金币
会不会跟CCR/ARR预装载配置有关?
请检查确认下。
在线时间4 小时
该用户从未签到主题帖子精华
新手上路, 积分 45, 距离下一级还需 5 积分
非常感谢,已经发现是CCR的预装载出现问题,谢谢!!!!
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
站长推荐 /2
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered bystm32中输出独立的PWM波和外部中断会干扰?-CSDN论坛-真格学网-IT技术综合网站
stm32中输出独立的PWM波和外部中断会干扰?-CSDN论坛
来源:互联网 &责任编辑:小易 &时间: 1:48:27
本网有用户碰到这样的问题:stm32中输出独立的PWM波和外部中断会干扰?-CSDN论坛,具体问题如下:
本网根据需求用户需求,为用户寻得以下其他网友提供的解决方法,方法仅供参考,具体如下:解决方案1:
void&EXTI9_5_IRQHandler(void)里面delay_ms(10);去掉
中断里面严禁加延时
中断里面严禁加延时
中断里面严禁加延时
重要的事情说三遍
解决方案2:
中断中禁止延时,和长时间的程序运行,中断函数只是用来处理一些简单的程序,可以改变标志位之类的简单函数。禁止延时,禁止延时,禁止延时
解决方案3:
问题已经弄清楚了,不是延时的问题,是printf();函数不能在中断程序中运行,否则程序会死在中断里。
改变方法有两个:1.去掉printf();,在中断里定义flag,并将flag=1;然后再在主函数的while()里用printf();
程序:while(1)
&&&&&if&(flag==1)
&&&&&&&&&&&&printf("%d\r\n",ReadValue);&
&&&&&&&&&&&&flag=0;
2.在#include&"pbdata.h"下面加上一段话
#pragma&import(__use_no_semihosting)&
_sys_exit(int&x)&
struct&__FILE&
/*&Whatever&you&require&here.&If&the&only&file&you&are&using&is&*/&
/*&standard&output&using&printf()&for&debugging,&no&file&handling&*/&
/*&is&required.&*/&
/*&FILE&is&typedef’&d&in&stdio.h.&*/&
本文相关:请教STM326路PWM输出的问题
[问题点数:50分]
本版专家分:0
CSDN今日推荐
本版专家分:9247
2015年8月 硬件/嵌入开发大版内专家分月排行榜第一2015年7月 VC/MFC大版内专家分月排行榜第一2015年5月 VC/MFC大版内专家分月排行榜第一2015年4月 VC/MFC大版内专家分月排行榜第一2015年3月 VC/MFC大版内专家分月排行榜第一2015年1月 硬件/嵌入开发大版内专家分月排行榜第一2013年12月 VC/MFC大版内专家分月排行榜第一2013年11月 VC/MFC大版内专家分月排行榜第一2013年6月 VB大版内专家分月排行榜第一2013年5月 VB大版内专家分月排行榜第一2013年1月 VB大版内专家分月排行榜第一2012年12月 VB大版内专家分月排行榜第一
2015年9月 VC/MFC大版内专家分月排行榜第二2015年7月 硬件/嵌入开发大版内专家分月排行榜第二2014年5月 VC/MFC大版内专家分月排行榜第二2014年3月 VC/MFC大版内专家分月排行榜第二2013年10月 VB大版内专家分月排行榜第二2013年7月 VB大版内专家分月排行榜第二2012年5月 VB大版内专家分月排行榜第二2012年4月 VB大版内专家分月排行榜第二2012年2月 VB大版内专家分月排行榜第二2011年11月 VB大版内专家分月排行榜第二
2015年11月 VC/MFC大版内专家分月排行榜第三2015年6月 VC/MFC大版内专家分月排行榜第三2015年2月 VC/MFC大版内专家分月排行榜第三2014年1月 VC/MFC大版内专家分月排行榜第三2012年3月 VB大版内专家分月排行榜第三2011年12月 VB大版内专家分月排行榜第三2011年10月 VB大版内专家分月排行榜第三
本版专家分:0
本版专家分:9247
2015年8月 硬件/嵌入开发大版内专家分月排行榜第一2015年7月 VC/MFC大版内专家分月排行榜第一2015年5月 VC/MFC大版内专家分月排行榜第一2015年4月 VC/MFC大版内专家分月排行榜第一2015年3月 VC/MFC大版内专家分月排行榜第一2015年1月 硬件/嵌入开发大版内专家分月排行榜第一2013年12月 VC/MFC大版内专家分月排行榜第一2013年11月 VC/MFC大版内专家分月排行榜第一2013年6月 VB大版内专家分月排行榜第一2013年5月 VB大版内专家分月排行榜第一2013年1月 VB大版内专家分月排行榜第一2012年12月 VB大版内专家分月排行榜第一
2015年9月 VC/MFC大版内专家分月排行榜第二2015年7月 硬件/嵌入开发大版内专家分月排行榜第二2014年5月 VC/MFC大版内专家分月排行榜第二2014年3月 VC/MFC大版内专家分月排行榜第二2013年10月 VB大版内专家分月排行榜第二2013年7月 VB大版内专家分月排行榜第二2012年5月 VB大版内专家分月排行榜第二2012年4月 VB大版内专家分月排行榜第二2012年2月 VB大版内专家分月排行榜第二2011年11月 VB大版内专家分月排行榜第二
2015年11月 VC/MFC大版内专家分月排行榜第三2015年6月 VC/MFC大版内专家分月排行榜第三2015年2月 VC/MFC大版内专家分月排行榜第三2014年1月 VC/MFC大版内专家分月排行榜第三2012年3月 VB大版内专家分月排行榜第三2011年12月 VB大版内专家分月排行榜第三2011年10月 VB大版内专家分月排行榜第三
本版专家分:0
匿名用户不能发表回复!|
其他相关推荐
/********CYSY_Kiti1013***********/
void TIM4_PWM_Init(u16 arr,u16 psc)//PD12 PD13 PD14 PD15
RCC-&APB1ENR|=1&&2;//使能TIM4
RCC-&AHB1ENR|=1&&3;//使能GPIOD
GPIO_Set(GPIOD,PIN12,GPIO_MODE_AF,GPIO_OTYPE_
STM32F103实现4路PWM波输出,用以控制电机
TIM2~TIM5输出3路PWM波实验,完整程序
主函数#include &BSP_TIM2.h&
#include &BSP_GPIO.h&
int main(void)
TIM2_Init();
KEY_GPIO_Config();
if(KEY_Scan(KEY_PORT, KEY_ON_PIN) == 1)
TIM2-&CCR2 = CCR_V
void pwm_color_init(void)
volatile uint8
/*datasheet 44,opt2 Port C5 alternate function = TIM2_CH1; port C6
alternate function = TIM1_CH1; port C7 alternate function =
问题的提出:最近需要用航模遥控器控制遥控车,32单片机做主控,需要用到4个通道即需要捕获4路PWM波。如果用四个定时器来捕获四路PWM波,就太浪费资源了。由于STM32单片机的定时器资源有限,故设想用一个定时器的4个通道同时捕获四路PWM波。设计思路:由于接收机输出的PWM波高电平最多就2ms,故可以让4个通道轮流使用定时器捕获PWM波程序如下:include “PWMin.h”
分类: 嵌入式
* \brief grant add here. timer module to generate 8 channal PWM output.
* PWM Channal pin mapping:
* PC9 - TIM8_CH4
* PC8 - TIM8_CH3
MSP430g2553单片机实现的输出三路PWM,PWM都已打包好,可以随便调整,实用性非常强!这是本人整理好的,非常实用
本人在做舞蹈机器人时,想到了通过一个定时器实现多路IO口输出多路可调的PWM,用于控制舞蹈机器人各部分的舵机。这个方法比较简洁而且实现自己的要求,且易于理解。
/*角度值:15度500us(10)——215度2500us(50)
端口A0——A5
#define uint unsigned
Date: Author:杨正
PWM英文名叫Pulse Width Modulation,中文名叫脉宽调制。那它到底是什么呢?其是它是由定时器产生的,比普通的定时器多了一个比较寄存器。PWM里面有一个词叫占空比,即一个周期内,高电平持续时间与周期的比值。如下图:
占空比(dutycycl

我要回帖

更多关于 鸡兔同笼问题 的文章

 

随机推荐