代码:利用STM32将一串ASCII码转变成周期固定占空比不同PWM波
能不能利用STM32将一串ASCII码转变成周期固定,占空比不一样的PWM波?跪求代码
直接将字符转为数字,例如word-'0'就可以直接转化为数字。
发送“MN”对应的二进制是“10011011001110“ 怎样将这个序列变成两个占空比不一样的方波?
使用定时器中断,在定时器中断里通过判断ASCII码值,来改变CCRx的大小
能帮忙写两句吗
小编 需要哪部分?
应该用PWM模式还是比较输出模式?是不是应该把TIM_OCInitStructure.TIM_Pulse设为变量?怎样定义这个变量?应该在哪定义?应该设置哪些中断,输出通道配置和中断函数能写下吗?谢谢您~
你好,我的看法如下:
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.本人水平有限,如有错误和疏忽,请指正。
不好意思啊,我似乎原理不太懂,TIM_OCInitStructure.TIM_Pulse = 1600;这句为什么要设为1600,不应该是2000吗?这样输出占空比才是2000/40000.
比方我发送A,串口1接收后,PWM产生占空比为4%的方波,这些语句应该在main函数里写,还是在哪写?您帮忙看看这是怎么回事
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的值,从而改变占空比,我没试过,所以不敢保证能行,你试试看