.ioc 파일의 ADC 설정에서 Sampling Time 을 84 Cycles로 지정했는데요, main 함수에서 동작 중에 이 값을 변경하려면 어떻게 해야 하나요? 어떤 때는 84cycles로 어떤 때는 480cycles로 AD하려고 하는데 가능한가요?
@ChrisWonyeobPark4 ай бұрын
네 가능합니다. cubemx에서 설정한대로 초기화 코드가 생성되고, STM32가 시작되면 해당 초기화 코드가 수행되면서 설정이 이뤄지는데, 그걸 사용자가 직접 작성해줄 수 있습니다. 즉, cubemx에서 생성된 84cycle로 설정하는 코드를 참고하여, 480cycle로 설정하는 사용자 코드를 직접 작성한 후에 그 코드를 실행해주면 그 후부터 설정이 바뀝니다. 84cycle로 초기화하는 코드와 480cycle로 초기화 하는 코드를 필요한 곳에서 적절하게 수행해주면 될 것 같네요. 단, 설정을 바꿀때는 deInit 같은 함수를 먼저 수행해줘야 할 수도 있으니 그것을 고려하시기 바랍니다.
@mkkang55824 ай бұрын
@@ChrisWonyeobPark 친절한 댓글 정말 감사합니다. 예를 들어, 타이머의 경우 Auto Reload Register는 Timer 초기화하는 void MX_TIM1_Init(void)에서는 htim1.Init.Period = 65535; 이렇게 설정하지만 main함수에서는 필요하면 TIM1->ARR = 1000; 이렇게 바꿔줄 수 있잖아요. ADC1 도 ADC1->something = 이렇게 sampling time을 쉽게 바꿀 수 있을거 같은데 그런 방법은 없는가해서요.
@ChrisWonyeobPark4 ай бұрын
@@mkkang5582 알림이 안떠서 확인이 늦었네요. 그것도 가능합니다. 아마 레퍼런스매뉴얼(데이터시트)을 보시면 설명되어있을 텐데요, 단, 레지스터를 통해 샘플링타임 설정을 바꿨을 때 어느 사이클부터 설정이 적용되는지 등에 대한 설명이 있을 것 같습니다. 자세한 것은 레퍼런스매뉴얼을 참고해보세요!
@_HF-uw1ov Жыл бұрын
혹시 ADC를 사용할때 5.5V 소스를 넣어줘도 상관 없나요?
@ChrisWonyeobPark Жыл бұрын
안녕하세요! STM32의 통상적인 ADC Vref 범위는 0~3.3V 입니다. 이 경우 3.3V 이상의 전압은 모두 saturation 됩니다. 5.5V 를 바로 ADC 하기는 어려울 것 같고, 전압 분배등의 회로를 거쳐서 0~3.3V 이내의 범위로 전압을 낮춰서 ADC 하는것이 좋겠네요.
@_HF-uw1ov Жыл бұрын
@@ChrisWonyeobPark 항상 빠른 답변 정확한 답변 감사드립니다
@ChrisWonyeobPark Жыл бұрын
@@_HF-uw1ov 감사합니다! 하시는 프로젝트 성공하시기 바랍니다~
@_HF-uw1ov Жыл бұрын
@@ChrisWonyeobPark 계속 보고있는데 궁금한게 있으면 댓글올릴게요 답장 꼭 부탁드려요 ㅎㅎ
@ChrisWonyeobPark Жыл бұрын
@@_HF-uw1ov 네 답변 가능한 선에서는 최대한 답글 달아드리도록 노력할게요!
@coup50366 жыл бұрын
아 항상감사합니다.. 정말 많은 도움이 됩니다.
@ChrisWonyeobPark6 жыл бұрын
도움이 된다니 감사합니다~
@kimseongmun26985 жыл бұрын
안녕하세요 ADC 1 setting을 하는 도중에 DMA Continuous requests 이Disabled 로만 설정이 가능하게 되어 있네요, 뭔가 설정이 잘못 되어 있는 건가요? 아니면 STM32F407VET6 이 칩과 연동이 불가능한건가요?? 따로 타이머는 필요가 없어서 ADC function만 설정하려고 하니 안되네요 혹시 다른 timer 라든지 켜야지 설정이 가능한가요?
@ChrisWonyeobPark5 жыл бұрын
안녕하세요! 아마 그 부분에 대한 내용이 강의에 있을거같은데 다시 설명드리면, DMA Continuous requests를 Enable 하시려면 먼저 DMA 설정이 되어있어야 합니다. CubeMX에서 ADC 내부의 DMA 설정탭으로 가셔서 DMA 설정을 완료하시면 Enable 시킬 수 있습니다.
@@kimseongmun2698 네 맞습니다! 다행히 잘 해결되셨나봅니다~ 다음 단계도 술술 잘 풀리시길 바래요~
@kimseongmun26985 жыл бұрын
@@ChrisWonyeobPark 안녕하세요 ADC를 사용하는 와중에 sampling time을 설정하는부분이 있는데요, 싸이클로 설정할 수 있어서 정확히 Sampling per second 라고 받아들이면 되나요?? 아니면 Cycle 횟수가 어떤의미를 갖고있나요? 하나더 궁금한 사항이 있는데. Terminal 1.9v 를 통해서 출력된 데이터들을 export 할수있나요? 혹은 DMA를 이용해서 memory에 저장된 데이터를 truestudio에서 추출할 방법이 있나요?
@ChrisWonyeobPark5 жыл бұрын
@@kimseongmun2698 아뇨 sps는 ADC하는 주기를 의미합니다. 여기서 말하는 cycle은 한 샘플링할때 소모하는 CPU 클럭 싸이클을 말합니다. ADC하는 과정에 대해 공부해보셔야 할 겁니다! 샘플 앤 홀드 같은 과정을 거쳐서 ADC가 이뤄지는데 그 과정을 아셔야지 이해할 수 있습니다!
@no.1pog8593 жыл бұрын
R강좌 잘보고 있습니다. ADC값을 LCD로 표시하여 보셨는데, 디버거 모드에서 IDE안에서 보려면 어케 해야 하까요?
@ChrisWonyeobPark3 жыл бұрын
안녕하세요! ST에서 제공하는 STM STUDIO라는 디버그 프로그램을 이용하시면 될 겁니다. ST-Link를 이용해서 런타임 변수들을 확인할 수 있습니다.
@no.1pog8593 жыл бұрын
@@ChrisWonyeobPark 네 감사합니다. 현재 STLINK-V3SET사서 , CUBEIDE에서 변수 보는법이 있으까요?
@ChrisWonyeobPark3 жыл бұрын
@@no.1pog859 CubeIDE에서도 가능할 겁니다. F3누르면 빌드 후 디버그모드로 들어가는데, 그때 step over, step into 등의 버튼으로 코드를 한줄한줄 수행할 수 있습니다. 자세한 사용법은 CubeIDE Debug를 검색해보시는게 좋을 것 같습니다. 역시 STM STUDIO로도 사용 가능하고요.
@joon_hyoungkong89374 жыл бұрын
100번정도 저장하고 평균을 내리고싶습니다만 혹시 DMA기능으로 연속으로 저장 가능한가요?
@ChrisWonyeobPark4 жыл бұрын
네 가능할 것 같습니다. 강의 내용에 4개의 ADC 결과를 배열에 순차적으로 저장하는 방법에 대해 설명합니다.
@joon_hyoungkong89374 жыл бұрын
@@ChrisWonyeobPark 오실로스코프를 만들어 볼려 합니다. 목표는 랜덤 1Mhz 파형을 저장했다 읽는 것입니다 stm32f407ve칩으로 가능한건가요?
@ChrisWonyeobPark4 жыл бұрын
@@joon_hyoungkong8937 1MHz면 상당히 고속에 속하는데요, 그건 레퍼런스매뉴얼을 확인해봐야 할 것 같습니다. 레퍼런스 매뉴얼의 ADC 챕터에서 Continuous Mode의 최대 ADC 주기를 확인해보시면 될 것 같습니다~
@joon_hyoungkong89374 жыл бұрын
@@ChrisWonyeobPark 감사합니다
@dlim28826 жыл бұрын
HAL_ADC_Start(&hadc1, &adcval[0],1); IAR환경에서 ADC값 받아서 UART통신 통해서 컴퓨터에 변화하는 디지털값을 받아보고싶은데 저 함수에서 계속 에러가 뜨는데 어떤 문제인지 알수 있을까요/ Error[Pe140]: too many arguments in function call C:\Users\AA\Desktop\practice_sub\ADC TEST\Src\main.c 117 ADC값 받은후 메인문에서 HAL_UART_Transmit(&huart3,adcval,1,10); 이렇게 쓰고싶은데 Error[Pe167]: argument of type "uint16_t *" is incompatible with parameter of type "uint8_t *" C:\Users\AA\Desktop\practice_sub\ADC TEST\Src\main.c 133 이런오류들이뜨네요 ㅠㅠㅠㅠ
@ChrisWonyeobPark6 жыл бұрын
에러메세지에 설명이 잘 나와있네요 ㅎㅎ 형태에 맞지 않는 포인터 변수에 의한 에러입니다. 이건 C언어 기본 문법이라 C언어 포인터 부분을 봐보세요~
@manikjang18155 жыл бұрын
HAL_ADC_Start(&hadc1); 이렇게 사용 하시면 될것 같습니다. ㅎㅎ
@mjuwjm4 жыл бұрын
안녕하세요. 강의 너무 유익하고 잘 보고 있습니다. 해당 영상을 CubeIDE에서 따라하고 있는데요. CLCD에 값이 출력이 안되서 무슨 이유인가 체크 중에 강의 중 설명하신 HAL_ADC_MspInit, HAL_ADC_MspDeInit 함수가 생성이 안된 것을 확인하였습니다. 해당 함수를 찾아보니 weak 처리된 함수 이던데요. 혹시 생성이 안된 이유를 알 수 있을까요?
@ChrisWonyeobPark4 жыл бұрын
안녕하세요 좋게 봐주셔서 감사합니다. 혹시 HAL드라이버가 아닌 LL드라이버를 쓰신다면 해당 함수가 생성되지 않을겁니다. 또는 확실친 않지만 다른 칩넘버 STM32를 쓰신다면 그럴 수도 있을 것 같습니다. 정확한 원인은 저도 잘 모르겠네요. 제 수업과 동일하게 설정하신게 맞는지 확인해보시기 바랍니다!
@mjuwjm4 жыл бұрын
답변 감사합니다. Google에 검색해보니 답이 나오네요.community.st.com/s/question/0D50X0000BbMcnpSQC/dma-adc-doesnt-workDMA초기화를 ADC보다 먼저하라고 하네요. Config register와 관련된 것 같은데정확한 내용은 모르겠습니다.
@ChrisWonyeobPark4 жыл бұрын
@@mjuwjm 오 그런 이슈도 있군요. 해당 글을 좀 읽어봐야겠습니다. 좋은 정보 알려주셔서 감사합니다! 해결이 잘 되신거였으면 좋겠네요~
@manikjang18155 жыл бұрын
안녕하세요. __HAL_LINKDMA(&hadc1,DMA_Handle,hdma_adc1); 이 함수를 이렇게 사용하면은 맞는건가요? 함수의 argument에 대해서 설명 좀 부탁 드리고자 합니다.
@ChrisWonyeobPark5 жыл бұрын
_HAL_??? 이렇게 시작하는 함수는 매크로함수 입니다. 매크로 정의로 가셔서 매개변수를 확인해보셔야 할 것 같습니다. 본 영상에서는 매크로함수는 쓰지 않습니다. 강좌를 천천히 보면서 따라하시면 어렵지 않게 구현하실 수 있으실겁니다~
@manikjang18155 жыл бұрын
@@@ChrisWonyeobPark 19:05 때에 보시면 라인 161이 이 함수를 configure하였는데, 안 쓰신건가요 이거는? 쓰신거라면 이 함수 설명 좀 부탁 드립니다. 감사합니다.
@ChrisWonyeobPark5 жыл бұрын
@@manikjang1815 아 저부분은 제가 작성한 내용이 아니고 CubeMX로 자동 생성된 코드입니다. 저 함수의 내용까진 알 필요가 없어서 설명드리지 않은거같아요~
@manikjang18155 жыл бұрын
@@ChrisWonyeobPark 안녕하세요. 지금 제가 HAL_ADC_Start_DMA(&hadc1,&adcValue[0],6) 이 함수를 콜해서 6개 채널의 센서 값을 읽으려고 하는데 6번의 conversion을 adcValue array에 순서대로 저장 하는 함수로 알고 있는데, 제 코드에서는 이 동작이 제대로 진행이 안되고 오로지 첫번째 채널만 reading이 되고 있는데, 혹시 저의 코드를 한번 이 메일로 보내면 봐주실수 있으신가요? 대단히 감사합니다.
@ChrisWonyeobPark5 жыл бұрын
@@manikjang1815 음 아마 DMA 설정이 잘못되지 않았나 싶습니다. Circulation 모드와 자동 증가를 해주셔야 다음 ADC때 메모리의 주소를 증가시키면서 저장합니다. 그리고 메모리의 끝까지 증가되면 다시 처음으로 돌아가서 저장하구요. 그 부분을 한번 제 강좌랑 비교해서 해보세요!
@peacem51534 жыл бұрын
HAL_ADC_Start_DMA 함수를 while문에 넣지 않고 한번만 호출하였는데, 어떻게 결과값이 실시간으로 바뀌는지 궁금합니다..
@ChrisWonyeobPark4 жыл бұрын
안녕하세요! 해당 내용은 강의안에 설명 되어있습니다. DMA가 뭔지 천천히 생각해보세요~
@nomadzen_s5 жыл бұрын
안녕하세요~! 강의 잘 보고있습니다! DMA 결과값들이 배열에 순차적으로 Circular 형태로 업데이트 되는데, 메모리를 최대한 할당하여 배열의 값을 저장해두고, 그 저장된 값을 이용하여 다른 알고리즘에 사용하고자 합니다. (ex. fft 등) 이 경우 어떤식으로 변경해야 할지 문의드립니다!
@ChrisWonyeobPark5 жыл бұрын
안녕하세요! 실시간 FFT 를 구동하시려면 버퍼 관리 특히 타이밍 관리에 많이 신경쓰셔야 할 것 같습니다. 원하시는 크기만큼 배열 할당을 하시고 DMA memory transfer가 끝나면 인터럽트를 이용해서 메모리전송 완료 시점을 찾으신 후에 새로운 배열에 다시 DMA 하시면 되지않을까 합니다. 듀얼 버퍼 관리같은 개념이겠네요. memory transfer complete 인터럽트가 있는지 확인해보셔야 할 것 같습니다. (제 기억으로는 있는걸로 압니다) 여담으로 ARM_MATH 라이브러리에 fft 함수를 제공하고 있는걸로 알고있습니다. 그 함수를 쓰시면 fft 걸리는 시간을 단축시킬수 있을 겁니다. 직접 fft를 구현하셔서 돌리면 아무래도 시간이 좀 더 걸릴거 같네요!
@nomadzen_s5 жыл бұрын
@@ChrisWonyeobPark 상세한 답변 감사드립니다. ^^ 말씀대로 한번 찾아보도록 할게요~!
@ChrisWonyeobPark5 жыл бұрын
저도 추측만 하고 답글 달아드린거라서 실제로 구현하는데는 제가 하더라도 시간이 좀 걸릴것 같습니다. 또 실시간 fft같은건 fft하려는 샘플 수 와도 연관이 있어서 처리시간을 고려하시면서 구현하셔야 할거에요! 우선은 DMA가 먼저 잘 작동하는지 한번 확인부터 해보세요!
@sungjinkim77305 жыл бұрын
안녕하세요 강의를 보면서 공부하고 있습니다만, ADC를 사용하던중 핀 갯수가 모자라는 상황이 발생했습니다... ㅠㅠ(ethernet과 겹치더라구요) 이럴때는 어떻게 해야할까요?
@ChrisWonyeobPark5 жыл бұрын
안녕하세요! 카페에서도 질문 주셨던 분인가 보네요. 카페에서도 말씀드렸듯이 데이터시트의 핀 맵을 보시면 대부분의 기능이 여러 핀에 할당되어있어서 핀을 잘 선택해서 사용하시면 될 겁니다. 근데 그렇지 않은 경우도 있으니 꼭 데이터시트의 핀 맵을 확인해보세요!
@윤상우-b5p6 жыл бұрын
adc 기능으로 hall sensor의 출력전압을 받아낼수 잇나요?/
@ChrisWonyeobPark6 жыл бұрын
홀센서는 전류센서를 말씀하시는거죠? 아날로그 출력형 센서라면 ADC를 통해서 전압을 읽어와야겠죠! 단, 전압의 범위가 0~3.3V 이내여야 합니다. 이보다 더 큰 전압이라면 반드시 주변회로를 구성하셔서 전압범위를 맞춰주셔야 합니다!
@@윤상우-b5p 이 경우엔 가변저항을 통해 나오는 전압이죠. 님같은 경우 홀센서에서 나오는 출력 전압을 ADC 핀에 연결해주면 될 겁니다. 먼저 센서의 출력전압 범위부터 확인해보세요~
@윤상우-b5p6 жыл бұрын
@@ChrisWonyeobPark 넵 알겟씁니다 갑사합니다!
@ChrisWonyeobPark6 жыл бұрын
@@윤상우-b5p 네 꼭 성공하시기 바랍니다~
@takunv45 жыл бұрын
안녕하세요! 말씀하신대로 PSD 값을 받고있습니다. 다만 현재 PSD를 6개동시에 사용하다보니 노이즈가 때문에 다른 값에 영향을 주는데 이러한 경우에는 어떻게하는게 좋을까요?
@ChrisWonyeobPark5 жыл бұрын
안녕하세요! 다른채널에 영향을 받는다면 채널간 샘플링 시간간격을 좀 더 크게 줘보세요~
@takunv45 жыл бұрын
@@ChrisWonyeobPark 답변감사합니다! 말씀하신대로 채널간 샘플링 시간간격을 늘렸는데도 영향을 받습니다... 현재 84cycle씩인데 너무 늘리면 전체 보드 클럭 속도에 영향을 주지않을까요??
@takunv45 жыл бұрын
한쪽 psd값이 오르면 다른쪽 값이 떨어지는 현상이 발생합니다. 샘플링시간간격을 최대로 해봤는데도 영향을 주네요...
@ChrisWonyeobPark5 жыл бұрын
@@takunv4 샘플당 시간간격이랑 샘플링 사이클도 좀 늘려보시기 바랍니다. 전체 보드 클럭속도에는 영향을 미치는건 아니지만 ADC하는데 걸리는 시간이 좀 더 걸리겠죠!
@takunv45 жыл бұрын
@@ChrisWonyeobPark 아 샘플링 사이클은 cubemx에서 설정하는부분 있어서 늘렸는데 말씀하신 샘플당 시간간격은 어떻게 늘리는건가요..? 타이머 인터럽트 하나 사용해서 주기마다 각 채널값을 받아오는식을 말씀하시는건가요??
@kkh86235 жыл бұрын
main함수에 HAL_ADC_Start_DMA(&hadc1, &adcval[0],4); 선언하고 while(1)문 안에 HAL_UART_Transmit(&huart1,&adcval[0],1,10); 를 선언해서 하는데 아무것도 뜨질 않네요.. 문법이 틀린걸까요?
@kkh86235 жыл бұрын
에러는 없는데 터미널프로그램으로 아무데이터가 안들어오네요 ㅠㅠ
@ChrisWonyeobPark5 жыл бұрын
@@kkh8623 혹시 제 실습보드를 사용하시나요? 문법적으로 문제가 없으면 잘 동작해야 하는데 회로가 다르면 동작하지 않겠죠. 사용하시는 회로에 맞게 CubeMX 설정과 소스코드를 잘 변경해서 사용하셔야해요~
@kkh86235 жыл бұрын
@@ChrisWonyeobPark 네 감사합니다.
@ChrisWonyeobPark5 жыл бұрын
@@kkh8623 네 꼭 성공하시기 바랍니다~
@kkh86235 жыл бұрын
cube mx로 stm32f103rb adc의 scan conversion mode를 사용하려고 하니 enable이 안되네요... 해당 기능이 없는걸까요?
@kkh86235 жыл бұрын
stm32f429 discovery 보드를 이용해서 다시 시도했는데 분명히 DMA continuous Requests를 Enable 했는데도, 코드에서 hadc1.Init.DMAContinuousRequests 코드가 작성이 안되네요.. ㅜㅜㅜ
@ChrisWonyeobPark5 жыл бұрын
@@kkh8623 음.... 아마 CubeMX 설정이 어딘가 잘못되어있지 않을까 합니다. 설정이 정확히 제 동영상 강좌와 일치하나요?
@kkh86235 жыл бұрын
@@ChrisWonyeobPark 제네레이트코드에서 자꾸 stm32f1용 드라이버가 생성되는게 원인이였습니다 분명히 mcu도 바꿔서 설정했는데.. 여러번했더니 제대로 생성되네요
@ChrisWonyeobPark5 жыл бұрын
@@kkh8623 오 해결되었다니 다행입니다! 전 사실 CubeMX와 TrueSTUDIO가 불편한 점이 상당히 많다고 생각되는데.. 가끔 설정이 이상하게 적용되거나 설정대로 프로젝트 생성이 안되는 경우가 있는것 같습니다. 저는 그럴땐 그냥 프로젝트 다 지워버리고 새로 생성해서 하곤 합니다..ㅎㅎ;;