Sounds like you're on .NET (or something case-sensitive). The best way to deal with this in my opinion is at the server level, by only allowing lowercase URLs. This is how you would implement this in .NET:
<match url="[A-Z]" ignorecase="false"></match>
<action type="Redirect" url="{ToLower:{URL}}" appendquerystring="true"></action>
Canonical tags are technically an option, but you will have to manually add them each and every time this issue occurs (and stay on top of it as an ongoing action item). It's almost always preferable to have each page accessible from a single URL if at all possible. Automatically adding self-referencing canonicals would probably just exacerbate the problem since they uppercase pages would still be pointing to the uppercase pages, lowercase to lowercase, etc.
I would strongly suggest defaulting to lowercase over uppercase URLs to stay consistent with other sites on the internet (also, most linking sites will assume lowercase when linking to your site).
The good news is this a fairly common, fixable problem
If your site is in fact using .NET, this article is a good starting point (#2 is where I got the above code snippet from).