今天我把PWM试验和串口通讯试验做了一些小修改,实现了用XCOM输入0-100发送给STM32让其做出相应占空比PWM波形。虽然我的试验时成功了。但是我还有几个小问题搞不明白。希望各位前辈赐教。
串口的函数我只修改了#define USART_REC_LEN 2 //定义最大接收字节数 2 。然后自己加了一个ASCII码转十进制码的小函数。u8 Ascii_decimalDate(u8 udat,u8 udat1);返回值就是Xcom输入的数字(0-100)。
主函数我就是除了一些初始化外,while(1)里面就是
[mw_shl_code=c,true] while(1)
{
if(USART_RX_STA&0x8000)
{
{
// len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
for(t=0;t<2;t++)
{
USART_SendData(USART1, USART_RX_BUF[t]); //向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); //等待发送结束
}
printf("
"); //插入换行
USART_RX_STA=0;
}
}
led0pwmval = Ascii_decimalDate(USART_RX_BUF[1],USART_RX_BUF[0]);
TIM_SetCompare1(TIM14,led0pwmval*5); //修改led0pwmval,修改占空比
USART_RX_STA=0;
}
}[/mw_shl_code]
这个就可以成功我的试验。
然后我把原子哥的那条发送的函数删了!成了下面
[mw_shl_code=c,true]
[mw_shl_code=c,true] while(1)
{
led0pwmval = Ascii_decimalDate(USART_RX_BUF[1],USART_RX_BUF[0]);
TIM_SetCompare1(TIM14,led0pwmval*5); //修改led0pwmval,修改占空比
USART_RX_STA=0;
}[/mw_shl_code]
就这三条,后来发现无论我用XCOM怎么发数据,结果灯就是不变亮度,我也不知道为什么会这样。[/mw_shl_code]
[mw_shl_code=c,true]然后我认为是主函数没有进入(因为那个接收中断我用LED1翻转只是没错误),所以我吧函数有多加了几条
[mw_shl_code=c,true] while(1)
{
led0pwmval = Ascii_decimalDate(USART_RX_BUF[1],USART_RX_BUF[0]);
TIM_SetCompare1(TIM14,led0pwmval*5); //修改led0pwmval,修改占空比
USART_RX_STA=0;
delay_ms(1000);TIM_SetCompare1(TIM14,0); delay_ms(1000);
}[/mw_shl_code]
这样我观察了一下,我用XCOM发数据,LED闪烁也会改变亮度,所以我认为没进主程序是错误的。然后我就吧程序改成了下面
[mw_shl_code=c,true] while(1)
{
led0pwmval = Ascii_decimalDate(USART_RX_BUF[1],USART_RX_BUF[0]);
TIM_SetCompare1(TIM14,led0pwmval*5); //修改led0pwmval,修改占空比
USART_RX_STA=0;
delay_ms(10);
}[/mw_shl_code]
就多加了个10ms延时, 问题居然就解决了, 我辛苦了一下午,为什么。[/mw_shl_code]
[mw_shl_code=c,true]1、我想请教为什么加10MS延时就可以成功了?[/mw_shl_code]
[mw_shl_code=c,true]2、这十秒延时意义是什么, 有什么重要含义, 以后写程序是不是要多注意这个10ms,我看原子哥程序也有过好多10MS延时的,这是不是个好习惯?[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
如果你是在PWM的高电平时灯亮,低电平时灯灭的话,你应该把PWM的频率调低一点,否则灯闪烁太快,人眼无法识别,这里加了延时就是这个作用吧
一周热门 更多>