請(qǐng)問一下CH573的PA9引腳用作TMR0功能可以做輸入捕獲用來進(jìn)行紅外解碼嗎?解碼NEC需要判斷高低電平的持續(xù)時(shí)間,是需要用另一個(gè)定時(shí)器的計(jì)數(shù)功能才可以實(shí)現(xiàn)嗎?如果要判斷低電平是否持續(xù)560us,那這個(gè)計(jì)數(shù)器計(jì)的數(shù)值為多少時(shí)才是560us呢?
CH57x CH58x 系列的芯片的26bit定時(shí)器的時(shí)鐘直接來自 系統(tǒng)時(shí)鐘,
當(dāng)系統(tǒng)跑到32M 情況下, 每32代表1us, 在60M情況下每60代表1us;
上帖低電平持續(xù)560us, 當(dāng)CH573 跑在60M的情況下, 560us captrue得到的值將會(huì)是60*360 = 33600這樣
另外一個(gè)注意的地方是, capture工作模式下,timer的輸出值的第26bit 指示的是采樣時(shí)候的電平;
如下是在主頻60Mhz下,timer開啟雙邊沿captrue下,中斷里面得到 us的處理(這里測試用到了打印,注意給合適的測試信號(hào),避免打印速度影響結(jié)果)
__attribute__((interrupt("WCH-Interrupt-fast"))) __attribute__((section(".highcode"))) void?TMR3_IRQHandler(?void?)????????//?TMR3?定時(shí)中斷 { ????uint32_t?cap_data; ????if?(?TMR3_GetITFlag(?TMR0_3_IT_DATA_ACT?)?)?{ ????????TMR3_ClearITFlag(?TMR0_3_IT_DATA_ACT?);??????//?清除中斷標(biāo)志 ????????cap_data?=?TMR3_CAPGetData(); ???????? ????????if(cap_data&(1<<25)){?//高電平 ????????????cap_data?=?cap_data&((1<<25)-1); ????????????PRINT("H?gap=%d?us\r\n",cap_data/60); ????????}else{ ????????????PRINT("L?gap=%d?us\r\n",cap_data/60); ????????} ????} }
初始化這樣寫對(duì)嗎,用定時(shí)器0輸入捕獲
????GPIOA_ResetBits(?GPIO_Pin_9?);?????????????//?配置PA9 ????GPIOA_ModeCfg(?GPIO_Pin_9,?GPIO_ModeIN_PU?); ????TMR0_CapInit(?Edge_To_Edge?); ????TMR0_CAPTimeoutCfg(?0xFFFFFFFF?);????//?設(shè)置捕捉超時(shí)時(shí)間 ????PFIC_EnableIRQ(?TMR0_IRQn?);
還需要使能?? TMR0_ITCfg( ENABLE, TMR0_3_IT_DATA_ACT );
void?Init(void) { ????GPIOA_ResetBits(?GPIO_Pin_9?);?????????????//?配置PA9 ????GPIOA_ModeCfg(?GPIO_Pin_9,?GPIO_ModeIN_PU?); ????TMR0_CapInit(?Edge_To_Edge?); ????TMR0_CAPTimeoutCfg(?0xFFFFFFFF?);????//?設(shè)置捕捉超時(shí)時(shí)間 ????TMR0_ITCfg(?ENABLE,?TMR0_3_IT_DATA_ACT?); ????PFIC_EnableIRQ(?TMR0_IRQn?); } __attribute__((interrupt("WCH-Interrupt-fast"))) __attribute__((section(".highcode"))) void?TMR0_IRQHandler(?void?) { ????uint32_t?cap_data; ????if?(?TMR0_GetITFlag(?TMR0_3_IT_DATA_ACT?)?) ????{ ????????TMR0_ClearITFlag(?TMR0_3_IT_DATA_ACT?);??????//?清除中斷標(biāo)志 ????????cap_data?=?TMR0_CAPGetData(); ????????if(cap_data&(1<<25)){?//高電平 ????????????cap_data?=?cap_data&((1<<25)-1); ????????????PRINT("H?gap=%d?us\r\n",cap_data/60); ????????}else{ ????????????PRINT("L?gap=%d?us\r\n",cap_data/60); ????????} ????} }
這是定時(shí)器輸入捕獲的代碼,連接的是一個(gè)紅外接收器,當(dāng)我按下遙控器時(shí)串口打印的信息如下
邏輯分析儀捕捉的圖像如下
任意邊沿觸發(fā)首先打印的應(yīng)該是 L gap=9398 us嗎,而且打印的高低電平與圖像也對(duì)不上。請(qǐng)問這是什么問題。
打印的波特率是多少?如果是115200的話,中斷里面打印的時(shí)間都比采樣脈寬要寬,會(huì)影響采樣。
這是9600波特率的打印,但是第一個(gè)被采樣的電平不應(yīng)該是低電平嗎
你是上電同時(shí)有邊沿輸入,還是芯片先上電在輸入的電平信號(hào),你可以先測單個(gè)脈寬試試,打印的話,9600太慢了,1個(gè)字節(jié)就差不多1ms,影響采樣。
方便給我發(fā)一下CH573觸摸按鍵的嗎
方便給我發(fā)一下CH573觸摸按鍵的嗎
方便給我發(fā)一下CH573觸摸按鍵的嗎
留個(gè)郵箱發(fā)給你
您好,我這里做了測試不在中斷中打印,
????while(1) ????{ ????????for(i=0;i<10;i++) ????????{ ????????????TMR1_Disable(); ????????????TMR1_PWMActDataWidth(?0?);??????????????//?占空比 ????????????TMR1_Enable(); ????????????DelayMs(9); ????????????TMR1_Disable(); ????????????TMR1_PWMActDataWidth(?10000?);??????????????//?占空比 ????????????TMR1_Enable(); ????????????if(cap_data&(1<<25))?//高電平 ????????????{ ????????????????cap_data?=?cap_data&((1<<25)-1); ????????????????PRINT("H?gap=%d?us\r\n",cap_data/60); ????????????} ????????????else ????????????????PRINT("L?gap=%d?us\r\n",cap_data/60); ????????????DelayMs(1000); ????????} ????????TMR1_PWMInit(?Low_Level,?PWM_Times_1?); ????????for(i=0;i<10;i++) ????????{ ????????????TMR1_Disable(); ????????????TMR1_PWMActDataWidth(?0?);??????????????//?占空比 ????????????TMR1_Enable(); ????????????DelayMs(9); ????????????TMR1_Disable(); ????????????TMR1_PWMActDataWidth(?10000?);??????????????//?占空比 ????????????TMR1_Enable(); ????????????if(cap_data&(1<<25))?//高電平 ????????????{ ????????????????cap_data?=?cap_data&((1<<25)-1); ????????????????PRINT("H?gap=%d?us\r\n",cap_data/60); ????????????} ????????????else ????????????????PRINT("L?gap=%d?us\r\n",cap_data/60); ????????????DelayMs(1000); ????????} ????????TMR1_PWMInit(?High_Level,?PWM_Times_1?); ????} ????__attribute__((interrupt("WCH-Interrupt-fast"))) ????__attribute__((section(".highcode"))) ????void?TMR0_IRQHandler(?void?) ????{ ????????if?(?TMR0_GetITFlag(?TMR0_3_IT_DATA_ACT?)?) ????????{ ????????????TMR0_ClearITFlag(?TMR0_3_IT_DATA_ACT?);??????//?清除中斷標(biāo)志 ????????????cap_data?=?TMR0_CAPGetData(); ????????????if(cap_data&(1<<25)){?//高電平 ????????????}else{ ????????????} ????????} ????}
串口打印的信息如圖
每次前四組數(shù)不太正確,這個(gè)要怎么保證第一次的數(shù)據(jù)就是正確的呢
個(gè)人信息保護(hù),已隱藏
已發(fā),請(qǐng)查收
您好,能否麻煩幫我看一下那個(gè)問題