主頁 >  其他 > arduino CAN-Shield PWM輸出及發送報文測驗

arduino CAN-Shield PWM輸出及發送報文測驗

2020-09-15 14:30:04 其他

最近EPS測驗設備有個扭矩傳感器在使用,輸出信號是5kHz~15kHz,對應的扭矩是-100Nm~100Nm,打算用Arduino采集這個信號。由于有Vector 的CANoe,希望把采到的信號發到CAN bus上,然后在CANoe上顯示。
為了測驗,買了個CAN-shield板,兼容UNO。測驗的時候先不連扭矩傳感器,先用UNO模擬輸出PWM。因為arduino的anlogWrite()發送的PWM頻率沒法更改,所以網上查了下手動配置的方法,用的是修改上限的快速PWM方式。

硬體:Arduino UNO R3;CAN-shield V2.0;

1、修改上限快速PWM輸出
參考Aduino官方PWM檔案和ATMEL328P的datasheet
修改上限快速PWM如果用TIMER2計時器的話,對應的輸出腳是3,11。3對應的是OCB輸出,11對應的是OCA輸出,這個模式下的OCB作為輸出,OCA只能當成輸出占空比固定為50%的PWM。本次用3當輸出。用12當輸入。

  int pin1=3;//output;OCCRA控制11腳,OCCRB控制3腳
  int pin2=12;//input 

然后是對四個暫存器TCCR2A,TCCR2B,OCCR2A,OCCR2B進行設定,預分頻選1/8,就是在TCCR2B里設定CS21。這樣輸出的頻率正好在5khz~15khz里。其它具體的設定方法抄在代碼注釋里了。

2、用CAN Shield V2.0把模擬的扭矩報文發CAN bus
CAN Shield對應的庫檔案,MS-CAN。直接呼叫就好了。為了便于后續CAN分析設備(PCAN,Vector CANoe等等)讀報文,把扭矩信號轉成0~10000的數,解析度0.01,分在兩個byte里,方向用個direction信號發,然后是0~255的counter和一個checksum。

3、測驗效果
用PCAN讀CAN Shield發的報文,用串口監視器讀頻率,扭矩的信號,對比一下,輸出是正常的。




/*
  模擬扭矩傳感器輸出頻率信號,并采集該信號轉換成合適的資料發送至CAN BUS
  
  - 針腳定義:3號腳輸出頻率脈沖,12號腳采集頻率脈沖:10號腳SPI_CS
  - 信號轉換:扭矩傳感器5khz~15hz 對應 -100Nm~100Nm;將扭矩信號
    轉換成0.01解析度,無符號型別,即扭矩CAN信號0~10000(0x0~0x2710),
    方向用direction信號發出,>=0為1,<0為0。
  - 頻率信號模擬方式:快速PWM,修改時鐘的計數上限
    B(3腳)輸出占空比可控信號,A輸出固定占空比(50%)且頻率為B的一半

*/


  #include <df_can.h>
  #include <SPI.h> 
  const int SPI_CS_PIN = 10;// Set CS pin
  MCPCAN CAN(SPI_CS_PIN);
  
  int pin1=3;//output;OCCRA控制11腳,OCCRB控制3腳
  int pin2=12;//input 

  double duration;  //高電平持續時間us
  double lowlevel;  //低電平持續時間us
  double OutputDuty;//輸出的占空比
  double period;    //脈沖周期
  double freq;      //脈沖頻率
  double torque;    //帶符號扭矩值
  int torque_send;  //扭矩取絕對值
  int torque_direction; //扭矩方向
  char data_to_PC;
  byte count=0; //message counter
  byte checksum=0;  //message checksum
  byte torque_send_high=0;  //高8位元組
  byte torque_send_low=0;   //扭矩低8位元組

void setup() 
{
  // put your setup code here, to run once:
   pinMode(pin1,OUTPUT); //3腳輸出
   pinMode(pin2,INPUT);  //12腳輸入
   //以下對Timer2進行設定,詳見ATMEL328P datasheet
   TCCR2A=_BV(COM2A0)|_BV(COM2B1)|_BV(WGM21)|_BV(WGM20);//COM2A0輸出A在到TOP輸出反相;COM2B1 輸出的B不反;WGM設定為111,即快速PWM控制計數上限
   TCCR2B=_BV(WGM22)|_BV(CS21);//預分頻為010:8分頻
/*
 TCCR2A
 Bit    7      6      5      4     3    2    1     0
     COM2A1 COM2A0 COM2B1 COM2B0   -    -  WGM21 WGM20
 
 Compare Output Mode,Fast PWM Mode:
 COM2A1 COM2A0
    0      0   Nomal port operation,OC2A disconnected
    0      1   WGM22=0:Normal port operation,OC0A disconnected;WGM22=1:Toggle OC2A on compare match
    1      0   Clear OC2A on compare match,set OC2A at BOTTOM(non-inverting mode)    
    1      1   Set OC2A on compare match,clear OC2A at BOTTOM(inverting mode)
 COM2B1 COM2B0
    0      0   Normal port operation,OC2B disconnected
    0      1   Reserved
    1      0   Clear OC2B on compare match,set OC2B at BOTTOM(non-inverting mode)
    1      1   Set OC2B on compare match,clear OC2B at BOTTOM(inverting mode)
    
 Mode WGM22 WGM21 WGM20 ||Timer/Counter Mode of Operation || TOP || Update of OCRx at || TOV Flag Set on
   0    0     0     0             Normal                     0xFF          Immediate          MAX
   1    0     0     1          PWM,phase correct             0xFF             TOP            BOTTOM
   2    0     1     0              CTC                       OCRA          Immediate          MAX
   3    0     1     1          Fast PWM                      0xFF            BOTTOM           MAX
   4    1     0     0          Reserved                       -                -               -
   5    1     0     1          PWM,phase correct             OCRA             TOP            BOTTOM 
   6    1     1     0          Reserved                       -                -               -
   7    1     1     1           Fast PWM                     OCRA            BOTTOM           TOP

  TCCR2B
 Bit    7      6      5      4     3     2     1     0
      FOC2A  FOC2B    -      -   WGM22 CS22  CS21  CS20
  Clock Select Bit Description
  CS22 CS21 CS20                Description
    0    0    0    No clock source(Timer/Counter stopped)
    0    0    1    clkT2s/(no prescaling)    
    0    1    0    clkT2s/8(from prescaler)
    0    1    1    clkT2s/32(from prescaler)
    1    0    0    clkT2s/64(from prescaler)
    1    0    1    clkT2s/128(from prescaler)
    1    1    0    clkT2s/256(from prescaler)
    1    1    1    clkT2s/1024(from prescaler) 
    
 */

OCR2A=249;//修改時鐘計數上限模式下,控制計數上限
OCR2B=50;//控制match的計數點

/*
頻率計算:
B:16M/8/(249+1)=8000Hz
A:16M/8/(249+1)/2=4000Hz
占空比計算:
B:(50+1)/(249+1)=20.4%
A:固定的50%
*/
Serial.begin(19200);
 int count = 50;                                     // the max numbers of initializint the CAN-BUS, if initialize failed first!.  
      do {
          CAN.init();   //must initialize the Can interface here! 
          if(CAN_OK == CAN.begin(CAN_500KBPS))                   // init can bus : baudrate = 500k
          {
              Serial.println(CAN BUS Shield init ok!");
              break;
          }
          else
          {
              Serial.println(CAN BUS Shield init fail");
              Serial.println("Please Init CAN BUS Shield again");
  
              delay(100);
              if (count <= 1)
                  Serial.println("Please give up trying!, trying is useless!");
          }
  
      }while(count--);
   
}

void loop() {
  // put your main code here, to run repeatedly:  
    //采集波形高電平階段時間,及低電平階段時間
    duration=pulseIn(pin2,HIGH);
    lowlevel=pulseIn(pin2,LOW);
    
    OutputDuty=CalculateOutputDuty(duration,lowlevel);//呼叫占空比計算函式
    period=duration+lowlevel; //周期=高電平加低電平時間
    freq=1/period*1000000;    //頻率=1/周期 (周期單位是us,所以頻率要乘10^6)
    
    torque=CalculateTorque(duration,lowlevel);//呼叫計算扭矩函式
    //扭矩方向信號計算
    if(torque>=0)
    {
      torque_direction=1;
      }
    if(torque<0)
    {
      torque_direction=0;
      }
    //發送的扭矩信號為絕對值,無符號  
    torque_send=abs(torque*100);
    if(5000<=freq<=15000)
    {
    //用byte強制轉換格式為一個位元組,把高8位去掉
    torque_send_low=byte(torque_send);
    //把2位元組右移8位,把低8位去掉
    torque_send_high=byte(torque_send>>8);
    }
     if((freq<5000)||(freq>15000))
    {
    torque_send_low=0xFF;
    torque_send_high=0xFF;
      }
    while(Serial.available()>0)
    {
      data_to_PC=Serial.read();
      if (data_to_PC=='s')//串口除錯助手輸入s并發送后列印資料
      {
    Serial.println(""); 
    Serial.print("The output duty is:");
    Serial.print(OutputDuty);
    Serial.println("%");    
    Serial.print("The High level interval is:");
    Serial.print(duration);
    Serial.println("us");      
    Serial.print("The Low level interval is:");
    Serial.print(lowlevel); 
    Serial.println("us");    
    Serial.print("The period is:");
    Serial.print(period);  
    Serial.println("us");
    Serial.print("The freq is:");
    Serial.print(freq); 
    Serial.println("Hz"); 
    Serial.print("The Torque_send is:");
    Serial.print(torque_send);        
    Serial.println(""); 
    Serial.print("The Torque Direction is:");
    Serial.println(torque_direction);               
      }
    }
    //counter0~255回圈
   if(count<=0xFF)
   {
    count++;
    }
   if(count>0xFF)
   {
    count=0;
    }
    //checksum 為前7位元組異或演算法
    checksum=torque_send_high^torque_send_low^torque_direction^0x0^0x0^0x0^count;
   //data[]定義報文的8個位元組資料
   unsigned char data[8]={torque_send_high, torque_send_low, torque_direction, 0x0, 0x0, 0x0, count, checksum};
   //用sendMsgBuf(ID,extended message or not,data length,data)函式發送報文報文 ID:0x111 報文型別:0為資料幀 長度:8位元組
   CAN.sendMsgBuf(0x111, 0, 8, data);
      delay(20);                       // send data per 20ms 
}

double CalculateOutputDuty(double i,double j)
{
  double cal;
  cal=i/(i+j)*100;
  return cal;
}
double CalculateTorque(double high,double low)
  {
    double cal_torque;   
      cal_torque=(freq-10000)/5000*100;      
      return cal_torque;     
  }

uj5u.com熱心網友回復:

太好了,正需要這方面的資料。

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/47362.html

標籤:單片機/工控

上一篇:計算機網路協議基礎

下一篇:求個華三Ap的韌體,萬分感謝

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more