你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

UART中斷接收與PWM控制問題

[复制链接]
nickyliu6 提问时间:2022-7-19 10:04 / 未解决
你好:
  我想做一個使用UART接收資料,並搭配PWM控制馬達的應用。我UART是使用中斷接收的方式主要功能為:

   PWM初始化,
    if(當UART接收到感測器端發送出來的資料)
     {
         調整PWM數值我UART是使用中斷接收的方式
     }
    else
     {
        維持PWM初始值
     }

   目前我僅把UART中斷接收資料的功能完成,但PWM的部份怎麼實作我不了解。請問我是要把PWM控制的程式寫到main 裡面的while迴圈嗎?如果是的話,那我上面if else的判斷式要怎麼寫?能否給個簡單的範例?
以下是我目前HAL_UART_RxCpltCallback部份的程式碼

  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)
  2. {

  3.                 RxLine++;                      //每接收到一个数据,进入回调数据长度加1
  4.             DataBuff[RxLine-1]=RxBuff[0];  //把每次接收到的数据保存到缓存数组

  5.             if(DataBuff[RxLine-1]==0xff && DataBuff[RxLine-2]==0xff && DataBuff[RxLine-3]==0xff && DataBuff[RxLine-4]==0xff)            //接收结束标志位
  6.             {

  7.                        uint32_t Data_speed = (DataBuff[3] << 24 ) + (DataBuff[2] << 16) + (DataBuff[1] << 8) + (DataBuff[0]);  //資料重組(MSB/LSB轉換)
  8.                        printf("Speed=%x\r\n",Data_speed);
  9.                        float result= IEEE754_to_decimal(Data_speed);   //uint32 to float(IEEE_754)
  10.                        printf("Speed=%f\r\n",result);

  11.                        memset(DataBuff,0,sizeof(DataBuff));  //清空缓存数组
  12.                        RxLine=0;  //清空接收长度
  13.                }

  14.             RxBuff[0]=0;
  15.             HAL_UART_Receive_IT(&huart3, (uint8_t *)RxBuff, 1);
复制代码


收藏 评论4 发布时间:2022-7-19 10:04

举报

4个回答
xmshao 回答时间:2022-7-19 11:13:10
hi,


基于你的描述,你是希望根据UART接收的信息来调整PWM输出进而控制马达的运作,对吧。


一般来讲,马达往往会有个初始状态,比方以某种速率运行还是停止。马达运转速率由PWM的频率和
占空比决定。 具体到这里涉及到计数器的分频系数,计数器的重装值ARR及输出比较寄存器CCR的值。


在时钟分频系数固定的情况下,我们调节的无非是ARR和CCR的值,更多时候是CCR值,最终取决于你应用
需求。


具体结合你当前应用,当UART收到相应的信息后,在UART中断里做信息识别,你可以直接对
ccr或ARR的值进行调整,从而调节马达的运行情况。




当然,还是建议你对PWM输出的基本特性了解下,这里就不细说了。


关于PMW输出只需在某个地方启动一次就行了,不需要在循环体内来反复启动运行。


比方像下面这样开启TIM1-CH1的PWM输出。


int main(void)
{

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

  MX_TIM1_Init();




  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);




   

  while (1)

  {
}
nickyliu6 回答时间:2022-7-19 11:28:44

想再進一步請教,您指的是UART有接收到資料的情況下,我可以對PWM進行相對應調整。但如果當我UART沒有接收資料的情況下如何將PWM再回覆到初始化的參數?
butterflyspring 回答时间:2022-7-20 09:36:52
当软件判断没有收到串口数据,可以将PWM的周期,占空比设置到缺省或安全状态。当然也可以读取当前的设置,慢慢增加或递减都可以。 如同之前那位大神所说,先了解定时器对于PWM的设置基本原理后,就很容易实现了。
xmshao 回答时间:2022-7-22 16:24:56
nickyliu6 发表于 2022-7-19 11:28
想再進一步請教,您指的是UART有接收到資料的情況下,我可以對PWM進行相對應調整。但如果當我UART沒有接 ...

呵呵!

首先你要自己清楚整个工程的工作逻辑,不然别人怎么知道该如何做呢?

你没有uart信息过来,PWM输出如何拟定参数是根据你的实际应用决定的啊,比方维持停止?或者以某个速率转动?。。。



关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版